使用flask_sqlalchemy创建表
flask_sqlalchemy:用来操作数据库的扩展包
好处: 不用编写sql语句
使用流程:
1.安装,导入包
pip install flask_sqlalchemy
pip install flask_mysqldb # 有可能装不上, 安装pip install pymysql
2.设置数据库的链接配置信息
3.创建SQLALchemy对象,关联app
4.编写模型类,属性信息,继承自db.Model
5.操作数据库(使用方法)
删除所有的表: db.drop_all()
创建所有的表:" db.create_all()
添加数据: db.session.add(obj)
添加多个数据: db.session.add_all([obj1,obj2])
提交: db.session.commit()
删除: db.session.delete(obj)
回滚: db.session.rollback()
注意点:
1. 默认的表名称是类名的小写, 如果需要指定表名使用__tablename__
2. 配置信息
如果安装的是flask_mysqldb, 链接地址:mysql://<用户名>:<密码>@<IP地址>:<端口>/<数据库名称>
如果安装的是pymysql, 链接地址:mysql+pymysql://<用户名>:<密码>@<IP地址>:<端口>/<数据库名称>
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 2.设置数据库的链接配置信息
#设置数据库的链接地址
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:[email protected]:3306/basic2"
#设置数据库的追踪信息,如果True每次改变之后都会追踪数据库增加额外开销,所以可以设置成False
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# 3.创建SQLALchemy对象,关联app
db = SQLAlchemy(app)
# 4.编写模型类,属性信息
#角色模型类(一方)
class Role(db.Model):
__tablename__ = "roles" #指定表名
#设置id为主键
id = db.Column(db.Integer,primary_key=True)
#设置角色名,唯一的
name = db.Column(db.String(64),unique=True)
#用户模型类(多方)
class User(db.Model):
__tablename__ = "users" # 指定表名
#设置id为主键
id = db.Column(db.Integer,primary_key=True)
#设置用户名,唯一的
name = db.Column(db.String(64),unique=True)
#外键,链接Role表中的id
role_id = db.Column(db.Integer,db.ForeignKey(Role.id))
@app.route('/')
def hello_world():
return "helloworld"
if __name__ == '__main__':
#删除表.,删除继承自db.Model的表
db.drop_all()
#创建表,创建继承自db.Model模型类的表
# db.create_all()
app.run(debug=True)
使用sqlalchemy查询
#数据库的查询操作
需求1: 如果知道了,角色的情况下,能不能快速查询到,哪些用户扮演了该角色.
role = Role.query.get(1)
role.users
使用: relationship关系属性
需求1: 如果知道了,用户的情况下,能不能快速查询到,该用户扮演了哪个角色.
user = User.query.get(1)
user.role
使用的是: backref 反向引用属性
注意点:
1. relationship, backref, 可以增加反向查询
2. lazy, 默认的值是subquery(做了子查询), 可以设置成dynamic(动态,用到才去查询)
准备数据:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 2.设置数据库的链接配置信息
#设置数据库的链接地址
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:[email protected]:3306/basic3"
#设置数据库的追踪信息,如果True每次改变之后都会追踪数据库增加额外开销,所以可以设置成False
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# 3.创建SQLALchemy对象,关联app
db = SQLAlchemy(app)
# 4.编写模型类,属性信息
#角色模型类(一方)
class Role(db.Model):
__tablename__ = "roles" #指定表名
#设置id为主键
id = db.Column(db.Integer,primary_key=True)
#设置角色名,唯一的
name = db.Column(db.String(64),unique=True)
#给Role添加了users关系属性, 好处: role.users 查询扮演了该角色的所有用户
#给User模型对应的表,添加了role关系属性, 好处: user.role, 查询到该用户扮演了哪个角色
users = db.relationship("User",backref='role',lazy="dynamic")
#为了方便对象查看,重写方法__repr__
def __repr__(self):
return "<Role: %s>"%self.name
#用户模型类(多方)
class User(db.Model):
__tablename__ = "users" # 指定表名
#设置id为主键
id = db.Column(db.Integer,primary_key=True)
#设置用户名,唯一的
name = db.Column(db.String(64),unique=True)
#邮箱
email = db.Column(db.String(64),unique=True)
#密码
password = db.Column(db.String(64),unique=True)
#外键,链接Role表中的id
role_id = db.Column(db.Integer,db.ForeignKey(Role.id))
#为了方便对象查看,重写方法__repr__
def __repr__(self):
return "<User: %s,%s,%s,%s>"%(self.id,self.name,self.email,self.password)
@app.route('/')
def hello_world():
return "helloworld"
if __name__ == '__main__':
#删除表.,删除继承自db.Model的表
db.drop_all()
#创建表,创建继承自db.Model模型类的表
db.create_all()
#为了方便查询,添加测试数据
ro1 = Role(name='admin')
db.session.add(ro1)
db.session.commit()
# 再次插入一条数据
ro2 = Role(name='user')
db.session.add(ro2)
db.session.commit()
#用户数据
us1 = User(name='wang', email='[email protected]', password='123456', role_id=ro1.id)
us2 = User(name='zhang', email='[email protected]', password='201512', role_id=ro2.id)
us3 = User(name='chen', email='[email protected]', password='987654', role_id=ro2.id)
us4 = User(name='zhou', email='[email protected]', password='456789', role_id=ro1.id)
us5 = User(name='tang', email='[email protected]', password='158104', role_id=ro2.id)
us6 = User(name='wu', email='[email protected]', password='5623514', role_id=ro2.id)
us7 = User(name='qian', email='[email protected]', password='1543567', role_id=ro1.id)
us8 = User(name='liu', email='[email protected]', password='867322', role_id=ro1.id)
us9 = User(name='li', email='[email protected]', password='4526342', role_id=ro2.id)
us10 = User(name='sun', email='[email protected]', password='235523', role_id=ro2.id)
db.session.add_all([us1, us2, us3, us4, us5, us6, us7, us8, us9, us10])
db.session.commit()
app.run(debug=True)
查询使用:
数据库增加,删除,修改操作:
增加:
user = User(name='laowang')
db.session.add(user)
db.session.commit()
修改:
user.name = 'xiaohua'
db.session.commit()
删除:
db.session.delete(user)
db.session.commit()
查询所有用户数据
User.query.all()
查询有多少个用户
User.query.count()
查询第1个用户
User.query.all()[0]
查询id为4的用户[3种方式]
User.query.get(4)
User.query.filter_by(id = 4).first()
User.query.filter(User.id == 4).first()
查询名字结尾字符为g的所有数据[开始/包含]
User.query.filter(User.name.endwith('g')).all()
User.query.filter(User.name.startswith('g')).all()
User.query.filter(User.name.contains('g')).all()
查询名字不等于wang的所有数据[2种方式]
查询名字和邮箱都以 li 开头的所有数据[2种方式]
User.query.filter(User.name.startswith('li'),User.email.startswith('li')).all()
User.query.filter(and_(User.name.startswith('li'),User.email.startswith('li'))).all()
查询password是 `123456` 或者 `email` 以 `itheima.com` 结尾的所有数据
User.query.filter(or_(User.password == '123456',User.email.endswith('itheima.com'))).all()
查询id为 [1, 3, 5, 7, 9] 的用户列表
User.query.filter(User.id.in_([1,3,5,7,9])).all()
查询name为liu的角色数据
user = User.query.filter(User.name == 'liu').first()
role = Role.query.filter(Role.id == user.role_id).first()
查询所有用户数据,并以邮箱排序
User.query.order_by(User.email).all()
User.query.order_by(User.email.desc()).all()
每页3个,查询第2页的数据
paginate = User.query.paginate(page, per_page,Error_out)
paginate = User.query.paginate(2,3,False)
page: 哪一个页
per_page: 每页多少条数据
Error_out: False 查不到不报错
pages: 共有多少页
items: 当前页数的所有对象