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:123456@127.0.0.1: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:123456@127.0.0.1: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='wang@163.com', password='123456', role_id=ro1.id)
    us2 = User(name='zhang', email='zhang@189.com', password='201512', role_id=ro2.id)
    us3 = User(name='chen', email='chen@126.com', password='987654', role_id=ro2.id)
    us4 = User(name='zhou', email='zhou@163.com', password='456789', role_id=ro1.id)
    us5 = User(name='tang', email='tang@itheima.com', password='158104', role_id=ro2.id)
    us6 = User(name='wu', email='wu@gmail.com', password='5623514', role_id=ro2.id)
    us7 = User(name='qian', email='qian@gmail.com', password='1543567', role_id=ro1.id)
    us8 = User(name='liu', email='liu@itheima.com', password='867322', role_id=ro1.id)
    us9 = User(name='li', email='li@163.com', password='4526342', role_id=ro2.id)
    us10 = User(name='sun', email='sun@163.com', 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: 当前页数的所有对象

### Flask-SQLAlchemy 版本列表及兼容性说明 Flask-SQLAlchemy 是一个专门为 Flask 应用程序提供 SQLAlchemy 集成支持的扩展工具。以下是关于其版本列表及其兼容性的详细介绍: #### 1. Flask-SQLAlchemy 主要版本概述 Flask-SQLAlchemy 的主要版本通常与其依赖项(如 FlaskSQLAlchemy)保持一定的兼容性。以下是一些常见版本的主要特性以及它们所支持的环境[^2]: - **Flask-SQLAlchemy 2.x**: 这一版本适用于较旧的 Flask 和 Python 环境,主要用于早期项目迁移或维护遗留代码。它支持 Flask 0.10 及以上版本,并且需要 SQLAlchemy 至少为 1.0 或更高版本。 - **Flask-SQLAlchemy 3.x**: 此版本引入了一些改进功能,例如更灵活的模型定义方式和支持更多的数据库适配器。推荐用于现代应用程序开发。此版本要求 Flask >= 1.0 并建议使用 SQLAlchemy >= 1.2[^3]。 - **Flask-SQLAlchemy 4.x**: 最新的稳定版系列提供了更好的性能优化、错误处理机制增强等功能。该版本完全移除了对过时 API 的支持,因此如果从低版本升级到此版本可能需要注意一些潜在破坏性更改。对于 Python 而言,最低需求通常是 Python 3.6+;而对于核心库,则需满足 Flask >= 2.0 和 SQLAlchemy >= 1.4[^5]。 #### 2. 如何查询当前安装的 Flask-SQLAlchemy 版本? 可以通过如下方法来获取已安装的 Flask-SQLAlchemy 版本号: ```python import flask_sqlalchemy print(flask_sqlalchemy.__version__) ``` 上述脚本能打印出当前环境中实际使用的 Flask-SQLAlchemy 版本信息[^4]。 #### 3. 关于兼容性和注意事项 当选择合适的 Flask-SQLAlchemy 版本时,请务必考虑以下几个方面: - **Python 版本**:不同版本可能会有特定的 Python 解释器要求。 - **Flask 版本**:确保所选 Flask-SQLAlchemy 版本能够良好运行在目标 Flask 上下文中。 - **SQLAlchemy 版本**:由于 Flask-SQLAlchemy 实际上是对 SQLAlchemy 的封装,所以两者的匹配程度至关重要[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值