flask-sqlalchemy 和sqlalchemy的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask-sqlalchemy 和sqlalchemy的区别相关的知识,希望对你有一定的参考价值。

flask-sqlalchemy把它的执行上下文绑定在了flask的app的context上。
但sqlalchemy本身提供了scoped_session.
如果把一个线程看成一个目录,那么其下有app.context栈和sqlalchemy.scoped_session2个资源。
现在他的实现,把sqlalchemy.scoped_session的资源放在了app.context栈下。
如果需要自己起个worker线程来处理redis的消息并写入数据库,那么flask-sqlalchemy的db对象就没有办法在自己的线程里执行了。
<a target="_blank" href="mailto:%E7%9B%B8%E5%8F%8D%E5%A6%82%E6%9E%9C%E6%8A%8Adb%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%92%8Capp%E7%9A%84context%E8%84%B1%E7%A6%BB%E5%BC%80%E6%9D%A5%EF%BC%8C%E5%B0%B1%E7%81%B5%E6%B4%BB%E5%A4%9A%E4%BA%86%E3%80%82%E5%8F%8D%E6%AD%A3%E5%8F%AA%E8%A6%81%E6%B3%A8%E5%86%8C%E4%B8%80%E4%B8%8B@<a href=" member="" app"="" style="color: rgb(119, 128, 135); text-decoration: none; word-break: break-all; font-family: 'Helvetica Neue', 'Luxi Sans', 'DejaVu Sans', Tahoma, 'Hiragino Sans GB', 'Microsoft Yahei', sans-serif; line-height: 22.4px; white-space: normal; background-color: rgb(255, 255, 255);">app.xn--teardown_appcontext,session-8x78c.xn--remove()ok-3m3p752k.">相反如果把db的实现和app的context脱离开来,就灵活多了。反正只要注册一下@app.teardown_appcontext,把session.remove()就ok了。
参考技术A It aims to simplify using SQLAlchemy with Flask by providing useful
defaults and extra helpers that make it easier to accomplish common
tasks. (官网原文)
flask-sqlalchemy 在 sqlalchemy 的基础上,提供了一些常用的工具,并预设了一些默认值,帮助你更轻松地完成常见任务。
flask-sqlalchemy 用起来比直接用 sqlalchemy 方便、省事,不过有些高级一点的功能如果不了解 sqlalchemy 的话会用不好。
所以个人建议最好先直接用 sqlalchemy 工作一小段时间,感受一下 sqlalchemy 到底是怎样运行起来的。等有了一定了解后,如果觉得有必要,再改用 flask-sqlalchemy,提高编程效率。
参考技术B res=db.session.query(tb.id).filter(...).all()
查询tb表id字段,多个字段就依次增加tb.id,tb.name...(这tb是已经模型化的)
取出来的res的结果是
[(1)]这样子的

纪幼淩洮锵薛根乘季称鞅次御俊丫鲍苗鄘穗殳慕

flask-sqlalchemy 迁移数据(生成数据库表)与 查询数据

1, 生成表

  db.Model主要用于数据库的增删改查操作, 构建表交给db.Table完成

  安装 pip install flask-migrate

from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.dialects.mysql import TINYINT, BIGINT, VARCHAR, CHAR, DATETIME, INTEGER
# 使用原生sqlalchemy创建字段
app = create_app()
# 创建数据库连接对象
db = SQLAlchemy(app)
# 构建表
t_user = db.Table(\'user_basic\',
                  db.Column(\'user_id\', BIGINT(10, unsigned=True), nullable=False, primary_key=True, autoincrement=True, comment=\'主键\'),
                  db.Column(\'status\', TINYINT(1), nullable=False, default=1, comment="状态"),
                  # db.Column(\'status1\', TINYINT(1), nullable=False, default=1, comment="状态1"),
                  db.Column(\'mobile\', CHAR(11), nullable=False, unique=True, comment=\'手机号\'),
                  db.Column(\'create_time\', DATETIME, nullable=False, default=datetime.now, comment=\'创建时间\'),
                  db.Column(\'update_time\', DATETIME, nullable=False, default=datetime.now, onupdate=datetime.now, comment=\'更新时间\'),
                  # 注意: 如果有外键, 定义方式和普通字段一样, 可以添加索引提高性能
                  # db.Column(\'leader_id\', BIGINT(10, unsigned=True), default=0, comment=\'上级的id\', index=True),
                  mysql_engine=\'MyISAM\',
                  mysql_charset=\'utf8mb4\')


if __name__ == \'__main__\':
    db.drop_all()
    db.create_all() #调用create_all()能找到对应的db.Tabke然后生成表

注释:逻辑外键添加index = True,生成外键,查询速度快

 

2,数据增删查改的模型:

from datetime import datetime

from flask_sqlalchemy import SQLAlchemy

def create_app(): #在其他地方封装的
    app = Flask(__name__)
    app.config[\'SQLALCHEMY_DATABASE_URI\'] = \'mysql://root:mysql@127.0.0.1:3306/sqlalchemy_test?charset=utf8\'
    app.config[\'SQLALCHEMY_TRACK_MODIFICATIONS\'] = False

    return app

app = create_app()

# 为了避免和创建表的db产生冲突, 创建专门用于数据操作的SQLAlchemy对象
model_db = SQLAlchemy(app)


class User(model_db.Model):  # db.Model主要用于数据的增删改查, 构建表交给db.Table去完成
    __tablename__ = \'user_basic\'
    # 由于模型不用于建表, 所以类型不需要设置的很严谨, 并可以省略大部分字段细节(除了default参数)
    user_id = model_db.Column(model_db.Integer, primary_key=True)
    status = model_db.Column(model_db.Integer, default=1)
    mobile = model_db.Column(model_db.String(11))
    create_time = model_db.Column(model_db.DateTime, default=datetime.now)
    update_time = model_db.Column(model_db.DateTime, default=datetime.now)


@app.route(\'/\')
def index():
    user1 = User()
    user1.mobile = \'18912341234\'
    model_db.session.add(user1)
    model_db.session.commit()
    return \'index\'


if __name__ == \'__main__\':
    app.run(debug=True)

注释:建表时如果字段中有default字段时,查询等操作的模型类也要写,不写会报错

 

2,迁移数据,  添加

当数据库升级,如增加字段,修改字段类型等,(删除外键等)

from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.dialects.mysql import TINYINT, BIGINT, VARCHAR, CHAR, DATETIME, INTEGER
from tool import create_app
from flask_migrate import Migrate

app = create_app()
# 创建数据库连接对象
db = SQLAlchemy(app)

# 初始化迁移器
Migrate(app, db)

# 构建表
t_user = db.Table(\'user_basic\',
                  db.Column(\'user_id\', BIGINT(10, unsigned=True), nullable=False, primary_key=True, autoincrement=True, comment=\'主键\'),
                  db.Column(\'status\', TINYINT(1), nullable=False, default=1, comment="状态"),
                  # db.Column(\'status1\', TINYINT(1), nullable=False, default=1, comment="状态1"),
                  db.Column(\'mobile\', CHAR(11), nullable=False, unique=True, comment=\'手机号\'),
                  db.Column(\'create_time\', DATETIME, nullable=False, default=datetime.now, comment=\'创建时间\'),
                  db.Column(\'update_time\', DATETIME, nullable=False, default=datetime.now, onupdate=datetime.now, comment=\'更新时间\'),
                  # 注意: 如果有外键, 定义方式和普通字段一样, 可以添加索引提高性能
                  # db.Column(\'leader_id\', BIGINT(10, unsigned=True), default=0, comment=\'上级的id\', index=True),
                  mysql_engine=\'MyISAM\',
                  mysql_charset=\'utf8mb4\')


if __name__ == \'__main__\':
    # db.drop_all()
    # db.create_all()
    pass
View Code

修改好后执行步骤,如果是已经改过,可以只执行最后两步

1,export FLASK_APP = init_db.py  #指定文件夹

2,flask db init  #生成migrations 文件 (迁移文件)

3,flask db migrate 生成版本文件    查看是否有变化 versions 多了一个文件 (修改的地方)

4,flask db upgrade  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于flask-sqlalchemy 和sqlalchemy的区别的主要内容,如果未能解决你的问题,请参考以下文章

安装了sql-alchemy但导入sql_alchemy时失败

flask 使用 SQLAlchemy 的两种方式

Flask-SQLAlchemy:用户角色模型和关系

Flask-Sqlalchemy 和水平缩放和范围会话

FLASK-SQLALCHEMY如何使用or和and条件进行组合查询

Flask-SQLAlchemy 和 Gevent 没有关闭 mysql 连接