flask_sqlalchemy
flask_sqlalchemy是flask框架中,一个输入数据操作的模块。由于利用数据库的语句,对数据库的操作极不方便,便产生了flask_sqlalchemy,使开发者可以通过python语言来操纵数据库。
一些常用的数据文件操作
- SQLALCHEMY_DATABASE_URI——连接数据的数据库
MySQL数据库连接配置为mysql://username:password@server/db,其中username是用户名,password是密码,server是要连接数据库服务器的IP及端口,db是要连接的数据库库名;
如:SQLALCHEMY_DATABASE_URI = ‘mysql://root:@localhost:3306/test’; - SQLALCHEMY_ECHO
若设为True,SQLAlchemy记录所有发送到标准输出的语句,对跳是有帮助; - SQLALCHEMY_RECORD_QUERIES——显式地禁用或启用查询记录
查询记录在调试或测试模式下自动启用; - SQLALCHEMY_NATIVE_UNICODE——显式地禁用原生的unicode
- SQLALCHEMY_TRACK_MODIFICATIONS
若设为True,SQLAlchemy将追踪对象的修改和发送信号;默认是None;
创建数据库中的表
在user的数据中创建两个表,User和Role。并向两个数据库中添加相应的数据。
from datetime import datetime
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from sqlalchemy import desc
'''自己对于SQLchemy的理解,由于自己每一次手动连接数据库以及对数据库的操作极不方便,而开发者又对语言比较熟悉,
因此,python中内置了一个flask_sqlalchemy,使开发者可以通过模块来编写相应的程序,来实现对数据库的复杂操作。'''
app = Flask(__name__)
# 对app进行配置,指定连接的数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:westos@localhost/user'
# SQLALCHEMY将会追踪对象的修改并发送信号
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# 创建一个数据库u对象,传入app表示的创建的对象已经连接到了自己创建Flask服务
db = SQLAlchemy(app)
bootstrap = Bootstrap(app)
# 每一个类对应的是一个表,不同的表示之间可以相互有联系
'''
__table__可以指定表的名称,替代原来的类名
实现一个一对多的关系
*** 多的的一端写外键
*** 少的一端写反向引用
'''
# db.Model 是db的一个属性,然后这个属性存入的是个类,所以User继承于db.Model类
# 用户表
class User(db.Model):
# primary_key是主键,数据是唯一的;autoincrement=True 默认数据是自增
id = db.Column(db.Integer,autoincrement=True,primary_key=True)
# unique=True 表示数据是唯一的
name = db.Column(db.String(50),unique=True)
passwd = db.Column(db.String(100))
# default 表示默认值
add_time = db.Column(db.DateTime,default=datetime.now())
gender = db.Column(db.Boolean,default=True)
# 用户的id,不能随便写,必须要使用外键关联其他表
# role_id 必须在role表中id者一列有这个值
role_id = db.Column(db.INTEGER,db.ForeignKey('role.id'))
def __repr__(self):
return '<user:%s>' %(self.name)
# 用户的角色表
class Role(db.Model):
id = db.Column(db.Integer,autoincrement=True,primary_key=True)
name = db.Column(db.String(50),unique=True)
users = db.relationship('User',backref='role')
def __repr__(self):
return "<role:%s>" %(self.name)
# 注意:上面的两个表并没有数据,只是创建了表和表之间的关系
if __name__=="__main__":
db.drop_all()
# 删除数据库通过类创建的表中的所有表,原有不是通过类创建的表会仍然存在在数据库中
# 创建所有的表
db.create_all()
# 向表中插入数据
'''
1.创建一个Python对象
2.将对象添加到会话中
3.提交会话
注意:自己所传入的每一行数据对应上面三个步骤
'''
role1 = Role(name='超级会员')
role2 = Role(name='会员')
db.session.add(role1)
db.session.add(role2)
db.session.commit()
# 添加100个用户
for i in range(50):
user = User(name='westos%d' %(i),passwd='westos',role_id=1)
db.session.add(user)
db.session.commit()
for i in range(50):
user = User(name='redhat%d' %(i),passwd='redhat',role_id=2)
db.session.add(user)
db.session.commit()
对表中的元素进行操作
- 查询所有数据
print(Role.query.all())
print(User.query.all())
结果:
- 根据条件进行查找
print(User.query.filter_by(role_id=1).all())
- 对于查找的内容进行更新
u = User.query.filter_by(name='westos0').first()
print(type(u))
print(u)
u.passwd='1253215'
db.session.add(u)
db.session.commit()
结果:
- 一个查询函数对应多个过滤函数
# 对于数据的查询进行限制
user = User.query.filter_by(role_id=1).limit(5).all()
print(user,len(user))
# 对于查询的数据进行排序
user = User.query.filter_by(role_id=1).order_by(User.add_time).all()
print(user)
# 多个过滤函数加一个显示函数
user = User.query.filter_by(role_id=1).order_by(User.add_time).limit(5).all()
print(user)
# offset 指定偏移量,limit 指输出量。类似于切片的操作
user = User.query.filter_by(role_id=1).order_by(User.add_time).limit(5).offset(2).all()
print(user)
# 利用切片也可以达到上面的效果
user = User.query.filter_by(role_id=1).order_by(User.add_time).slice(2,7).all()
print(user)
# 查看获取信息的数量
count = User.query.filter_by(role_id=1).order_by(User.add_time).slice(2,7).count()
print(count)
结果:
- 分页查找
# 分页显示:第一个参数代表显示第几页的数据,第二个参数代表每页显示多少条数据
user = User.query.paginate(1,5)
print(user.items)
结果: