Flask_SQLAlchemy

使用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: 当前页数的所有对象

猜你喜欢

转载自blog.csdn.net/weixin_40420525/article/details/80896655