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
猜你喜欢
- 怎么用javascript进行拖拽本文译自:http://www.webreference.com/programming/javascri
- 一、备份数据库1、打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server2、SQL Server组-->
- 本文实例讲述了Python实现向服务器请求压缩数据及解压缩数据的方法。分享给大家供大家参考,具体如下:向服务器请求压缩数据格式,并解压缩数据
- 1 . 如何让自己的本地APACHE服务器支持.htaccess 如何让自己的本地APACHE服务器支持”.htaccess”呢?其实只要简
- asp之家注:本文介绍的长文章分页方法不错,作者分析的很详细,用分页符来手动为长文章分页,应该是最好的长文章分页方法,我们不必担心会把一些代
- 执行环境会负责管理代码执行过程中使用的内存,编写JavaScript程序时,所需内存的分配以及无用内存的回收完全实现自动管理。原理:找出那些
- 1.reshapereshape是重塑,常用的三种写法如下:numpy.arange(n).reshape(a, b) &nb
- 一、数据类型分类1、按存值个数区分单个值:数字,字符串多个值(容器):列表,元组,字典,集合2、按可变不可变区分可变:列表[],字典{},集
- 新闻系统、blog系统等都可能用到将动态页面生成静态页面的技巧来提高页面的访问速度,从而减轻服务器的压力,本文为大家搜集整理了ASP编程中常
- Python编程中raise可以实现报出错误的功能,而报错的条件可以由程序员自己去定制。在面向对象编程中,可以先预留一个方法接口不实现,在其
- 前言GO语言在WEB开发领域中的使用越来越广泛,Hired 发布的《2019 软件工程师状态》报告中指出,具有 Go 经验的候选人是迄今为止
- 原文: gradio.app/interface-s…1.全局状态例子来解释import gradio as grsc
- 反射反射即想到4个内置函数分别为:getattr、hasattr、setattr、delattr 获取成员、检查成员、设置成员、
- 在软件开发过程中经常会遇到数据库升迁的问题,原因比较多,如acsess访问速度比sql server慢、删除数据记录后access会留下空档
- 在Windows vista之前的微软操作系统的地址栏与浏览器的地址栏是一样的,也是面包屑般的自上而下的线性等级形,如果想从D盘跳到C盘是不
- php二维数组排序测试数据 $arr = [
- 这是个老话题了,之所以再拿出来说,是因为浏览器一直在进步,以前最好的方法现在不一定是最好的。1 如何进行字符串连接?首先让我们来回顾一下字符
- 元素的CSS样式,除了包括内联的(即通过style属性加上的)样式定义外,还有页面嵌入的css和外部引入的css两种方式。但在JS中通过el
- 进程、线程和协程之间的关系和区别也困扰我一阵子了,最近有一些心得,写一下。进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调
- Web 设计离不开调色板,现成的调色板多不胜数,不管是 Windows 标准色板,还是 Web 标准色板,还是 Pantone 色板,它们虽