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

作者:芥末拌饭??????? 时间:2021-09-22 22:11:18 

前言

说到面向对象,大家都不陌生。关系型数据库也是后端日常用来存储数据的,但数据库是关系型的,因此,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()

来源:https://juejin.cn/post/7130832178132287496

标签:Python,flask,sqlalchemy
0
投稿

猜你喜欢

  • 网页设计的十要十不要

    2007-12-21 13:01:00
  • python正则表达式去除两个特殊字符间的内容方法

    2023-08-24 16:22:10
  • PL/SQL编程经验小结开发者网络Oracle

    2010-07-18 13:27:00
  • PHP实现PDF转图片的方法详解

    2023-05-26 19:59:51
  • Python 实现训练集、测试集随机划分

    2023-02-12 01:41:24
  • Python使用Selenium爬取淘宝异步加载的数据方法

    2021-05-17 05:31:57
  • Python3+Appium实现多台移动设备操作的方法

    2021-01-15 00:58:43
  • Jmail发信的实例,模块化随时调用

    2007-09-27 13:35:00
  • JS中ESModule和commonjs介绍及使用区别

    2023-10-20 22:23:51
  • Python迭代和迭代器详解

    2023-11-20 08:52:28
  • form的submit方法和submit事件(onsubmit)

    2008-09-28 13:29:00
  • django 基于中间件实现限制ip频繁访问过程详解

    2022-06-24 08:38:43
  • Python绘图Matplotlib之坐标轴及刻度总结

    2023-10-01 15:56:39
  • 一个div层打开显示效果 js

    2008-05-19 12:35:00
  • ORACLE应用经验(1)

    2010-07-31 12:53:00
  • python logging类库使用例子

    2023-10-31 11:17:11
  • Linux删除系统自带版本Python过程详解

    2023-10-21 03:12:13
  • 对网站内嵌gradio应用的输入输出做审核实现详解

    2023-07-22 08:22:05
  • ASP.NET(AJAX+JSON)实现对象调用

    2023-07-19 12:29:33
  • asp使用XMLHTTP下载远程数据输出到浏览器

    2007-11-04 10:34:00
  • asp之家 网络编程 m.aspxhome.com