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


猜你喜欢
- function is_email($str){ //检验email return preg_match("/
- 编程零基础,可以学习 Python 吗”,这是很多初学者经常问我的一个问题。当然,在计算机方面的基础越好,对学习任何一门新的编程语言越有利。
- 也不一定,以前从来没有深入的研究过sql查询,最近买了一本T-SQL查询的书,把以前忽视的问题都记录一下 以前一直模模糊糊的把sqlserv
- 玩过knockoutjs的都知道,有一个强大的功能叫做component,而这个component有个牛逼的地方就是拥有自己的viewmod
- 代码如下:arr = array(12,52,14,43,24,58,15,64,24,57,17,56,45)&nbs
- 现在同类型的网站数不胜数,网站的功能或服务日趋同质化,大的方面看不出什么差别,差别就体现在细节上。“窥斑见豹”,细节成为网站最有力的表现形式
- 什么是探索性数据分析(EDA)?EDA 是数据分析下的一种现象,用于更好地理解数据方面,例如: – 数据的主要
- 1.后台action产生json数据。List blackList = blackService.getBlackInfoList(mobi
- 声明定位元素:position属性值设置除默认值static以外的元素,包括relative,absolute,fixed。平台:win/I
- 默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为W
- 1、概念装饰器(decorator)就是:定义了一个函数,想在运行时动态增加功能,又不想改动函数本身的代码。可以起到复用代码的功能,避免每个
- 在学习Python3的正则表达式的时候遇到一个例子#!/usr/bin/python3import reline = "Cats
- 1. 普通装饰器 import logging1. foo = use_loggine(foo) def use_loggine(func)
- 本文我们以一个登录例子来说明Flask对 post请求的处理机制。1、创建应用目录,如mkdir examplecd example2、在应
- 前言我们今天来介绍一个js案例,本文仅供学习参考,大家谨慎使用。 我们先认识一下,什么是js逆向。JavaScript 逆向是指对 Java
- 误区 #9: 数据库文件收缩不会影响性能错误! 收缩数据
- 下面介绍两种查看django 执行的sql语句的方法。方法一:queryset = Apple.objects.all()print que
- 方法 bindParam() 和 bindValue() 非常相似。 唯一的区别就是前者使用一个PHP变量绑定参数,而后者使用一个值。 所以
- 如何提高SQL Server数据库的性能,该从哪里入手呢?笔者认为,该遵循从外到内的顺序,来改善数据库的运行性能。如下图: 第一层
- 作为开发者,我们可以通过以下3中方式来配置logging:1)使用Python代码显式的创建loggers, handlers和format