Python flask sqlalchemy的简单使用及常用操作

 更新时间:2022年08月17日 10:42:04   作者:芥末拌饭​​​​​​​  
这篇文章主要介绍了Python flask sqlalchemy的简单使用及常用操作,在python中,常用的ORM工具就是sqlalchemy了。下面就以一个简单的flask例子来说明吧,需要的小伙伴可以参考一下

前言

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

flask sqlalchemy的配置使用

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

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

from flask import Flask

app = Flask(__name__)
@app.route('/')
def orm_test():
    return "hello"

接下来我们导入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了。

  • 然后我们新增一个表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__来指定数据库了。

具体修改如下:

修改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

表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='字段释义')

最后,我们在接口中使用下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 Flask
from 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、or
from 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]}
# 查询数据count
count = 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时,在配置时记得根据实际情况添加相关配置参数,比如连接池的数量、自动回收连接的秒数等等。

到此这篇关于Python flask sqlalchemy的简单使用及常用操作的文章就介绍到这了,更多相关Python flask sqlalchemy内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 命令行界面的用户交互及优化

    python 命令行界面的用户交互及优化

    这篇文章主要为大家介绍了python 命令行界面的用户交互及优化方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Python input输入超时选择默认值自动跳过问题

    Python input输入超时选择默认值自动跳过问题

    这篇文章主要介绍了Python input输入超时选择默认值自动跳过问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • python列表与元组详解实例

    python列表与元组详解实例

    python列表与元组详解实例,本文是基于python2.x的讲解,这点一定要注意。
    2013-11-11
  • Python DBM模块轻松使用小型数据库存储管理数据

    Python DBM模块轻松使用小型数据库存储管理数据

    这篇文章主要介绍了Python DBM模块轻松使用小型数据库存储管理数据,它可以让你轻松地存储和管理键值对数据,可以使用 dbm 模块来操作 DBM 文件,或者使用 shelve 模块来存储任意类型的 Python 对象
    2024-01-01
  • python常见字符串处理函数与用法汇总

    python常见字符串处理函数与用法汇总

    这篇文章主要介绍了python常见字符串处理函数与用法,结合实例形式详细分析了Python字符串操作函数find、join、replace及split功能、使用技巧与操作注意事项,需要的朋友可以参考下
    2019-10-10
  • Python打印输出数组中全部元素

    Python打印输出数组中全部元素

    使用Python打印数组时会遇到一个问题,当打印的数组元素比较多时,会出现只打印出数组开始与结尾部分中间部分用省略省略了,下面的方法可以完美解决这个问题
    2018-03-03
  • 详解python requests中的post请求的参数问题

    详解python requests中的post请求的参数问题

    这篇文章主要介绍了详解python requests中的post请求的参数问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • python实现决策树、随机森林的简单原理

    python实现决策树、随机森林的简单原理

    这篇文章主要为大家详细介绍了python实现决策树、随机森林的简单原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)

    python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)

    今天教大家怎么实现Tkinter透明窗体,在上篇文章给大家介绍过透明窗体上绘制小球,今天接着通过实例代码给大家分享python使用tkinter实现透明窗体上绘制随机出现的小球的实例代码,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • Python使用pandas导入csv文件内容的示例代码

    Python使用pandas导入csv文件内容的示例代码

    这篇文章主要介绍了Python使用pandas导入csv文件内容,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12

最新评论