写点什么

flask sqlalchemy 使用简述

  • 2022-10-15
    广东
  • 本文字数:2559 字

    阅读完需:约 1 分钟

前言

说到面向对象,大家都不陌生。关系型数据库也是后端日常用来存储数据的,但数据库是关系型的,因此,ORM 通过对象模型和数据库的关系模型之间建立映射,我们就能像操作对象一样来操作数据库。ORM 的优点主要是面向对象编程,不需写原生 SQL,用操作对象的方式访问数据。当然,缺点就是当遇到复杂的操作时,ORM 就不那么好写了,还有就是加了一层映射,执行效率低于原生 sql。不过,对于大部分项目来说,这些缺点都是可以接受的。牺牲的性能可以接受;有复杂操作时,实现就用原生 SQL,ORM 执行罢了。

flask sqlalchemy 的配置使用

在 python 中,常用的 ORM 工具就是 sqlalchemy 了。下面就以一个简单的 flask 例子来说明吧。


  1. 首先,写一个最简单的 flask 项目,代码如下:


from flask import Flask
app = Flask(__name__)

@app.route('/')def orm_test(): return "hello"
复制代码


  1. 接下来我们导入 ORM 配置,添加如下代码:


from flask_sqlalchemy import SQLAlchemy
def orm_config(): url = "mysql+mysqlconnector://{user}:{pwd}@{host}:{port}/{db_name}?charset=utf8" orm_conf = { 'SQLALCHEMY_DATABASE_URI': url } return orm_conf
# ORM 设置app.config.from_mapping(orm_config)db = SQLAlchemy(app)
复制代码


这样我们就将 ORM 配置 OK 了。


  1. 然后我们新增一个表 table1 的 model


# model表名class Table1(db.Model):    # 表名    __tablename__ = "table1"
id = db.Column(db.Integer, primary_key=True) col = db.Column(db.String(64), nullable=False, unique=True, comment='字段释义')
复制代码


以上配置这是在数据源只有一个库的时候,但很多时候我们还需要访问别的库,这时需要在 ORM 配置和 model 上做一些设置。

ORM 配置中需要用到SQLALCHEMY_BINDS来添加数据库, model 中__bind_key__来指定数据库了。具体修改如下:


3.1 修改 ORM 配置:


def orm_config():    url = "mysql+mysqlconnector://{user}:{pwd}@{host}:{port}/{db_name}?charset=utf8"    # 指定的别库    other_url = "mysql+mysqlconnector://{user1}:{pwd1}@{host1}:{port1}/{db_name1}?charset=utf8"    orm_conf = {        'SQLALCHEMY_DATABASE_URI': url,        # 添加别库        "SQLALCHEMY_BINDS":{                "other_db":other_url            },    }    return orm_conf
复制代码


3.2 表 model 指定库:


class Table2(db.Model):    # 指定别库    __bind_key__ = 'other_db'    __tablename__ = "table2"        id = db.Column(db.Integer, primary_key=True)    col = db.Column(db.String(64), nullable=False, unique=True, comment='字段释义')
复制代码


  1. 最后,我们在接口中使用下 ORM。


@app.route('/')def orm_test():    # 查询table1数据    rows = Table1.query.filter(Table1.id<5)    res = []    for row in rows:        dict = {            "id": row.id,            "col": row.col        }        res.append(dict)    return "hhh"
复制代码


当我们遇到复杂操作,不知道 ORM 语法该怎么写时,还可以直接用原生 sql + ORM session execute 的方式执行,示例如下:


sql = "select count(*) as cnt from table1 group by col"rows = db.session.execute(sql)
复制代码


以上例子我们是查询 table1 表的 id<5 的数据。完整代码如下:


from flask import Flaskfrom flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

def orm_config(): url = "mysql+mysqlconnector://{user}:{pwd}@{host}:{port}/{db_name}?charset=utf8" other_url = "mysql+mysqlconnector://{user1}:{pwd1}@{host1}:{port1}/{db_name1}?charset=utf8" orm_conf = { 'SQLALCHEMY_DATABASE_URI': url, "SQLALCHEMY_BINDS":{ "other_db":other_url }, } return orm_conf


# ORM 设置app.config.from_mapping(orm_config)db = SQLAlchemy(app)
# model表名class Table1(db.Model): # 表名 __tablename__ = "table1"
id = db.Column(db.Integer, primary_key=True) col = db.Column(db.String(64), nullable=False, unique=True, comment='字段释义') class Table2(db.Model): # 指定库 __bind_key__ = 'other_db' __tablename__ = "table2" id = db.Column(db.Integer, primary_key=True) col = db.Column(db.String(64), nullable=False, unique=True, comment='字段释义')

@app.route('/')def orm_test(): # 查询table1数据 rows = Table1.query.filter(Table1.id<5) res = [] for row in rows: dict = { "id": row.id, "col": row.col } res.append(dict) return "hhh"

if __name__ =="__main__": app.run()
复制代码

sqlalchemy 的增删改查

刚开始接触 sqlalchemy 时,对于语法不熟悉,写代码也是比较痛苦的。这里总结下 sqlalchemy 常用的语法吧。

查询数据

# 查询id<5的数据q = Table1.query.filter(Table1.id<5)# 查询过滤用 and、orfrom sqlalchemy import and_, or_q = Table1.query.filter(and_(Table1.id<5, Table1.col=='掘金'))q = Table1.query.filter(or_(Table1.id<5, Table1.col=='掘金'))# 查询过滤用in(语法:model.{字段名}.in_({列表}))q = Table1.query.filter(Table1.id.in_([1,2,3]))# 连表查询q = Table1.query.join(Table2, Table2.id==Table1.id) \                   .filter(Table1.id<5)                 # 解析数据res = {'data': [dict(i) for i in q]}# 查询数据countcount = q.count()
复制代码

增加数据

row = Table1(id=1, col='掘金')db.session.add(row)db.seesion.commit()
复制代码

修改数据

 row = Table1.query.filter(Table1.id<5) update_data = {"col": "掘金"} row.update(update_data) db.session.commit()
复制代码

删除数据

row = Table1.query.filter(Table1.id<5)row.delete()db.session.commit()
复制代码


备注: 增删改都要 commit()

总结

以上就是对 sqlalchemy 的简单使用及常用操作了。我们在工程代码中使用 sqlalchemy 时,在配置时记得根据实际情况添加相关配置参数,比如连接池的数量、自动回收连接的秒数等等。

发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2020-06-16 加入

还未添加个人简介

评论

发布
暂无评论
flask sqlalchemy使用简述_sqlalchemy_芥末拌个饭吧_InfoQ写作社区