目录
一、定义数据模型
1.常用SQLAlchemy列选项
选项名 | 说明 |
primary_key | 表的主键 |
unique | 值唯一 |
index | 创建索引,提高查询效率 |
nullable | 允许有空值 |
default | 定义为默认值 |
2.常用SQLAlchemy关系选项
选项名 | 说明 |
backref | 在关系的另一模型中添加反向引用 |
primary join | 明确指定两个模型之间使用的联结条件 |
uselist | 若为False,则使用标量值 |
order_by | 指定关系中排列方式 |
secondary | 指定多对多中排序方式 |
secondary join | 在SQLAlchemy中无法自行决定时,指定多对多关系中二级联结条件 |
例:创建表
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
#配置数据库地址
app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:[email protected]/flask_sql_demo'
#跟踪数据库修改--》不建议开启
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
db=SQLAlchemy(app)
'''
两张表
角色(管理员/普通用户)
用户ID
'''
#数据库模型需要继承db.Model
class Role(db.Model):
#定义表名
__tablename__='roles'
#定义字段,db.column表示是一个字段
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(16),unique=True)
class Users(db.Model):
__tablename__='users'
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(16),unique=True)
#db.ForeignKey('roles.id')表示是外键,表名.id
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
#删除表
db.drop_all()
#创建表
db.create_all()
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
二、增删改操作
1.Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理,会话用db.session表示,准备把数据写入数据库之前,先将数据添加到会话中,然后调用commit()方法提交会话,查询操作是通过query对象操作数据
1>db.session.add():添加到数据库的session中
2>db.session.add_all():添加多个信息到session中
3>db.session.commit():提交事务—数据库修改
4>db.session.rollback():数据库回滚操作
5>db.session.delect():删除数据库
2.添加管理员:
role=Role(name='admin')
db.session.add(role)
db.session.commit()
添加用户:
user=User(name='zs',role_id=role.id)
db.session.add(user)
db.session.commit()
3.修改信息:修改过后直接提交
user.name='xiaoming'
db.session.commit()
4.删除操作:删除后直接提交
db.session.delect(user)
db.session.commit()
三、关系引用
1.利用relationship描述模型之间的关联,修改后的代码:
class Role(db.Model):
#定义表名
__tablename__='roles'
#定义字段,db.column表示是一个字段
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(16),unique=True)
#在一的一方,写关联
users=db.relationship('User',backref='role')#表示和User模型发生关联,增加一个users属性,不会在字段中出现
#repr()方法显示一个可读字符串
def __repr__(self):
return '<Role: %s %s>' % (self.name,self.id)
class User(db.Model):
__tablename__='users'
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(16),unique=True)
#db.ForeignKey('roles.id')表示是外键,表名.id
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
#User希望有role属性,但是属性的定义,需要在另一个模型中定义
def __repr__(self):
return '<User:%s %s>' % (self.name,self.id)
2.通过role来查询users
role.users
3.通过user来查询他的角色
user1.role
四、查询操作
1.常见SQLAlchemy查询过滤器
2.常见SQLAlchemy查询执行器
3.操作:
1>查询所有用户数据
User.query.all()
2>查询有多少个用户
User.query.count()
3>查询id为4的用户
User.query.filter(User.id==4).first()
User.query.filter_by(id=4).first()