- 积分
- 16843
在线时间 小时
最后登录1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
1.介绍4 e+ }+ K! p' m" Y9 {# _0 i2 e. i. `4 \
flask用于orm操作表,一般使用flask- sqlalchemy 操作简单4 C% f. p: L* w7 [4 f
一般使用flask-sqlalchemy 2.5.13 y2 x! i, F h. F* T
https://flask-sqlalchemy.palletsprojects.com/en/2.x/
( l( S- U& w5 a/ a, A1 i6 P! @( F. h$ T: `9 v- E1 N8 c7 u' T: q
! D$ Y8 x! v. X
6 a5 S9 }2 r5 O. Q* Y2.安装
& }0 M9 v1 _0 ypip instal flask-sqlalchemy==2.5.1" [! D, s ~; Q( x
pip install Flask-Migrate==2.6.0 # 迁移数据库使用
G' B# w# j& U; j+ Y' i. E- q: A0 k7 d/ Y& \ H
5 }0 L3 h/ {% _. q* k0 E% K3 f3.数据库* [+ B/ _, Z4 j* n
1.配置 连接数据库9 z, z; y1 p0 g z
代表驱动
6 s2 O% e) \, D& tMySQL-Python # 可以写mysqldb0 v$ g6 A3 V! T4 ^7 J
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>( @$ H9 V7 P4 }! k `- |
$ ^& F- E1 s, A4 d& b- L8 H5 O% }2 C
pymysql7 j/ U+ ]+ k7 l& Y
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
9 ]- `7 o0 [$ a+ ?! c
! U# _+ v9 {9 a$ h3 _8 H, b$ z) W, sMySQL-Connector3 c# s& S1 R- Z
mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname
$ x( s% j5 H0 O
" y& Y9 Y& U) }- E$ s
8 F0 }" n. B0 [4 b) i$ R+ ~5 D1 B- ]" h* z/ X; t, x q+ ]
需要安装不同的扩展 注意mysqlclient的版本
@* f6 b- |' W9 t0 R9 l可以放到配置类里面; n& c/ U" p A5 d
% X: c2 N" m0 p6 e. u; A: Y" r
方法一
1 a- V+ o0 I n$ cSQLALCHEMY_DATABASE_URI = 'mysql://user:密码@localhost:3306/库名?charset=utf8mb4'
4 n w& D' j0 i2 m @1 @4 m h4 n% |5 d
方法二
0 T; d% I! E" _DIALECT = 'mysql'
0 r7 S) B9 F+ c# r0 H# h% K" i* J9 m6 HDRIVER = 'pymysql'
7 a$ a6 n% U1 A6 [USERNAME = 'root'
% x( S; p2 f9 I8 oPASSWORD = '****'# u5 b2 \$ E( h$ G+ F
HOST = '127.0.0.1'
: D2 V, g) b, b! u, A: ?) YPORT = '3306'# k% W/ |! R: m: J% G0 H
DATABASE = '数据库名'
- _# s5 b% Q( {3 }6 {% p1 ^. `# p3 z C, R7 d
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE)8 w& \: A' S r6 }- @: `' z Y0 Q
9 q3 g# i9 Z" I# y6 S5 [8 C$ c3 c0 ^% l" t5 |8 E
2.连接数据库
7 c! k# g* j! U, p+ K! u1 实例化SQLAlchemy对象 可放入其他文件
1 ]9 l) ?. s) R+ Y5 Rfrom flask_sqlalchemy import SQLAlchemy. a' w6 r0 S& b! ?4 g2 d; y
db = SQLAlchemy(), p7 ^. I A; I, b, x2 L p x
0 F4 p* G* z8 Q1 _( H: Z3 e
2 注册db: G5 r8 `% F8 Q+ k
4 l6 V& t+ d+ N2 H! b# 初始化迁移数据库3 }4 i$ t- V" d f- \2 y; y1 @; K( s- t
migrate = Migrate()2 _& j- Q* f- e6 A
( x6 @4 r3 i* }def create_app() -> Flask:6 k& l7 U( w* \
app = Flask(__name__)
1 j( R% E" i9 ~$ j1 e/ Y app.config.from_object(Config)
; m9 {# A* Y9 \* W" m& k1 ^$ Q1 U # 绑定数据库9 c5 \2 b2 p& y' U1 y9 }
db.init_app(app)
3 O) {- ]& L: P0 n4 ^" b
+ J! X1 k) c B; Q9 x # 迁移数据库
7 F1 w$ ?9 R0 A migrate.init_app(app, db)
& ^/ n2 O6 Q* x/ T+ k0 l6 [ return app5 j6 i: i# o2 v8 k$ C3 h
2 v2 Z9 ?! E$ y. i% \! j3 G/ m3 \5 {/ u" f3 W# ?9 ~9 _+ F
注意命令可能无法迁移/ J' b# n) J+ Q: n, A" C
C' U) W' d7 Q' t9 S' C
1. 命令行一直报
; L' f6 p+ n P% {1 k# Error: Could not locate a Flask application. Use the 'flask --app' option, 'FLASK_APP' environment variable, or a 'wsgi.py' or 'app.py' file in the current directory.
# k9 p6 E8 \6 p6 [9 @ R7 b* K" q' ~' E z* J6 Q& z' m y5 D
这是在虚拟环境没有配置4 ^% n, @! Z+ M. z. `# w& m$ O
2 N, R8 s" ^ |. [使用 .env 文件 来设置数据
) O4 B5 Q" x+ o& }0 O# 下载 插件
2 D' r4 O+ K0 P' ipip install python-dotenv
4 g. E1 O/ D+ i, r3 O
* H0 N+ x6 E$ f5 y" z8 o Z# 创建app2 ~9 T4 Z, L) Y! ~9 b7 t* W
def create_app() -> Flask:
8 ^$ L* G. x) e* b app = Flask(__name__)0 V3 D) h# b6 b/ O% V7 B- T0 S
# 要在最开始加载 后面才能获取到: _2 g7 @/ J6 L" v
load_dotenv(verbose=True)) B2 Z' t: s0 H% L
2 J9 N) v* v# ^5 f: u p# W3 p8 o
# 注册配置文件 生成/测试
" N1 Q% R0 u" l) z- Q # env = str(os.environ.get("FLASK_ENV")). x1 H+ F- ]* V L: u# m
env = str(os.getenv("FLASK_ENV"))- E# I( y3 G" ?
app.config.from_object(getattr(conf, env))$ g* w' R! y% h6 B7 L1 \- d
3 p+ U" X$ e$ i, w2 z' u
# 绑定数据库
# y0 D! J0 q$ d- g3 j# j db.init_app(app)2 N% s& w* G$ [* l
) Y7 h4 W }+ L. N& ?& J# Q # 迁移数据库1 r5 _* o1 K/ ?# h/ q; W, N
migrate.init_app(app, db)( g4 g) H) f$ C, H* V3 L# @$ U
return app* o5 _+ u0 }) Z# y$ M( v) }" V
#-------------------------------------
. u- j. T# A1 c R# .env 文件) e8 L3 L' x! ^% Y/ _
5 ]" A, L+ Y/ q5 L6 b6 Q$ f3 t3 Q
FLASK_APP=main.py # 自己的启动文件 默认是app.py5 N2 [+ x6 i" o2 \6 ?% Z: p
FLASK_ENV=development
( t& k4 f2 W! t, {- {) V kFLASK_DEBUG=True
! i& q7 V M# P p' I! }5 Y/ J! o8 f8 Q# Y. z, T. g
; K7 H' Y, k L; h: f- }. Y这样就可以输入命令了
( i3 O# e+ W2 J0 U' h
# F4 X$ Y: l. ?" z" O报错误 either 'sqlalchemy_database_uri' or 'sqlalchemy_binds' must be set.
5 l( I$ g- ^2 E) Z- |% _$ u$ V没有把模型放到 view文件里面 只想要把 模型导入就好了,可以不使用
; x0 H6 w" U: k+ D7 W/ M1 A- Nfrom user.model import User2 w; ~# n3 S9 a4 r3 t5 k7 \, C2 [! ~1 D
: h; Y' q; r+ x* }" J8 }
7 K; E ^% |2 M9 B/ \2 \
3 迁移数据库) X: O3 x6 o* f+ M; R2 A; E2 ^+ O
# 初始化一个迁移脚本的环境,只需要执行一次。
5 l3 M& M8 f8 `( a' eflask db init
, m" k: p7 J) p& X# 将模型生成迁移文件,只要模型更改了,就需要执行一遍这个命令! [" W& I( Q! _4 d* S
flask db migrate -m'迁移数据库'
0 H- ?9 s* u a) f# `3 d# 将迁移文件真正的映射到数据库中。每次运行了migrate命令后,就记得要运行这个命令。0 t8 }4 W& ^$ u" h" u/ y+ J+ C
flask db upgrade. A- F4 {$ f @( O8 D2 ~
#-------------------------------------
: m2 q* v$ x0 w9 c* }$ ~flask db heads 查看当前最新的迁移id
& h. a3 N) X9 z3 M* Jflask db stamp heads # 更新1 l9 a% I+ o- @5 f4 B: B
flask db current # 查看当前迁移id
6 S& G! M3 y m+ |5 @( j, ^0 ?python manage.py db history #查看历史: L# p8 B1 E& n) z
python manage.py db downgrade 652a55840d #回退版本
- P) s: E! l8 K+ J, @; U# q* t9 c+ A# T& C+ u0 K) L
( v r- Z* {8 H/ J% z' P f( q
4 数据库其他信息- U* q* ^. I5 n$ b; H6 g) Q
# 查询时会显示原始SQL语句: g9 g. f4 z; d, r. F
SQLALCHEMY_ECHO = True. o* a3 ? F h1 V7 H. e* L, ^
# 动态追踪修改设置,如未设置只会提示警告& K8 B0 X- h$ Y
SQLALCHEMY_TRACK_MODIFICATIONS = False
, v# B4 Q W+ E1 j& v8 p8 D# 数据库连接池的大小* R' ~* K& N9 F$ |
SQLALCHEMY_POOL_SIZE = 10$ v6 O6 T; @6 ?$ e
# 指定数据库连接池的超时时间1 j2 x/ G, R$ P; o' l
SQLALCHEMY_POOL_TIMEOUT = 10
3 G4 L5 o* G1 }# 控制在连接池达到最大值后可以创建的连接数。当这些额外的 连接回收到连接池后将会被断开和抛弃。+ l, S, ]( S9 ~ ?8 v
SQLALCHEMY_MAX_OVERFLOW = 2; p& v& r% l& \ N4 g
# B* {* E; a1 z1 f+ Q$ k
) J7 i# K M4 `$ ^3 Z! z
名字 备注; d& U9 M+ c. j$ o" @% @
SQLALCHEMY_DATABASE_URI 用于连接的数据库 URI 。‘mysql+pymysql://root:密码@localhost:3306/库名?charset=utf8mb4’$ q, Y8 I/ {. F, l4 L+ n& D
SQLALCHEMY_BINDS 一个映射 binds 到连接 URI 的字典。更多 binds 的信息见用 Binds 操作多个数据库。
5 x& m0 y; f: k, uSQLALCHEMY_ECHO 如果设置为Ture, SQLAlchemy 会记录所有 发给 stderr 的语句,这对调试有用。(打印sql语句)
2 s4 u- \: g! E, J. o ]1 g. A7 ESQLALCHEMY_RECORD_QUERIES 可以用于显式地禁用或启用查询记录。查询记录 在调试或测试模式自动启用。更多信息见get_debug_queries()。7 ?; u! k5 ~9 @
SQLALCHEMY_NATIVE_UNICODE 可以用于显式禁用原生 unicode 支持。当使用 不合适的指定无编码的数据库默认值时,这对于 一些数据库适配器是必须的(比如 Ubuntu 上 某些版本的 PostgreSQL )。
5 H" k4 O: E. I9 K; S) h. F; V& xSQLALCHEMY_POOL_SIZE 数据库连接池的大小。默认是引擎默认值(通常 是 5 )
+ X, _5 O3 [7 ]( h9 sSQLALCHEMY_POOL_TIMEOUT 设定连接池的连接超时时间。默认是 10 。
) t4 O0 }" y- sSQLALCHEMY_POOL_RECYCLE 多少秒后自动回收连接。这对 MySQL 是必要的, 它默认移除闲置多于 8 小时的连接。注意如果 使用了 MySQL , Flask-SQLALchemy 自动设定 这个值为 2 小时。 h; Z! H* ~# v( m: ?: M
4 创建表/ ^$ l I8 `' n2 O5 @ F7 J
from core import db #这里需要引入实例化的SQLAlchemy对象/ h4 Q7 n- G6 ]2 \1 F4 t
3 m( {/ K, v4 K! p, f4 p& `3 J6 rclass User(db.Model):( a4 r; q6 i3 S0 q( C3 J1 B. P
"""用户表"""
$ t5 A, R j2 Q: U# C5 E __tablename__ = 'user' # 创建后表名 小写; E- R* B% Q+ F3 D) c# _
# __abstract__ = True # 抽象表 不创建这个表 可以继承! G7 W0 c9 F: t t7 y9 i
7 H: J) H) r- `+ p* K+ x
id = db.Column(db.Integer, primary_key=True, comment='id主键') # 必须要有
0 o! n" T0 ?1 Q username = db.Column(db.String(32), unique=True, comment='用户名')
! K6 b5 b/ S; N- W password = db.Column(db.String(64), nullable=False, comment='密码')' \' S& Z3 ?0 n- i# P
gender = db.Column(db.Boolean, default=0, comment='0 男 1 女')
( c7 q& o& C" G, _/ e# D: F2 B avatar = db.Column(db.String(125), default='http://s5p.hd-bkt.clouddn.com/default.jpg', comment='头像')- J0 Q; N' k# K/ l" u
addr = db.Column(db.String(256), comment='地址')% a$ o6 ]/ \: p+ r
email = db.Column(db.String(125), comment='邮箱')
+ R) o/ k8 K. [/ p$ F mobile = db.Column(db.String(11), comment='电话')
. Q" L0 k& j0 m' x login_type = db.Column(db.Integer, comment='1 电话 2 邮箱 3 用户名')
: S+ \' E0 a `
: R. P# A; `8 o/ P( C Q def __repr__(self): # 查询的返回 和str一样
; {1 q! J- U9 j: c return f'<{self.__class__.__name__} {self.username}>'3 B1 A* a+ _" I, h% L7 O1 _' ]
n9 k/ X% d, ?$ D9 m
* P, g4 I! s4 F( c i# r
1.字段解析
# \, h" B# }; W o5 X* i3 a. `- Z类型名 python中类型 说明
) K% J2 `5 A4 R, h; f+ sInteger int 普通整数,一般是32位
+ ?5 r+ L( G h; r3 ~1 z8 X* N USmallInteger int 取值范围小的整数,一般是16位
- G1 T: V/ Z& M, nBigInteger int或long 不限制精度的整数
% u5 I# d6 w3 C1 r DFloat float 浮点数
+ a0 S: |2 g( U6 [3 {8 b9 rNumeric decimal.Decimal 普通整数,一般是32位
+ V& F; p$ C9 c5 T. ^) ^' f' UString str 变长字符串
6 v1 y+ O9 P$ \" J, Q) R0 b$ o2 ?Text str 变长字符串,对较长或不限长度的字符串做了优化
% v N, f d' W9 K n0 PUnicode unicode 变长Unicode字符串
' x- l6 \& l" E% y9 L8 jUnicodeText unicode 变长Unicode字符串,对较长或不限长度的字符串做了优化' G& m) L( |+ S2 l7 O
Boolean bool 布尔值
- X/ b9 o p, p2 D+ a2 bDate/DateTime datetime.date 时间
0 J4 I3 U1 [% T& ?0 bTime datetime.datetime 日期和时间
5 u9 i- k% l# s2 N5 }, KLargeBinary str 二进制文件
1 J4 k3 m; d7 Y* n, F2.表属性
! W0 D" A9 ^7 X/ C3 c! ^选项名 说明 Q# Q0 U7 Z! s* G/ P
primary_key 如果为True,代表表的主键( x: S. c$ \( O) g4 o' d! j- X3 p d
unique 如果为True,代表这列不允许出现重复的值1 @( w4 l5 S& ?# W8 ?
index 如果为True,为这列创建索引,提高查询效率& w& d# b& m- f M
nullable 如果为True,允许有空值,如果为False,不允许有空值' `& {3 l# C' G1 m% u/ Q
default 为这列定义默认值
* T, y( W1 D, P ^9 N5.查询
4 ?' a' d# p/ {% C5 o$ G注意只要对数据库操作就需要 db.session.commit()9 U1 j9 K8 O2 }9 ^
2 |) [6 q' Y) G) H! s
查询方法
! y9 c e( x+ B$ L. U方法 说明
4 \2 }7 K2 B; \# Jall() 以列表形式返回查询的所有结果
8 U/ G9 c1 X( k& B6 e! [# |: Q" Afirst() 返回查询的第一个结果,如果未查到,返回None
$ ^# }3 T3 t7 E6 r- P( lfirst_or_404() 返回查询的第一个结果,如果未查到,返回404
6 l! x; @4 G2 C3 Zget() 返回指定主键对应的行,如不存在,返回None! `7 D0 L+ w9 b. I
get_or_404() 返回指定主键对应的行,如不存在,返回404
2 Y3 |0 K+ |. Z7 t, M$ F$ Jcount() 返回查询结果的数量4 X( w$ t5 Y( a8 v; M9 B
paginate() 返回一个Paginate对象,它包含指定范围内的结果' V0 a' q' I, @+ E/ f. N# ^" e1 T/ X
1.普通查询
6 F* O8 y. K) V. _# 查询数据条数
" q: K# y2 i9 K! X' F8 ^User.query.count()/ d& `! t! U U& X2 q
/ u. g; J2 p# {: |! N# 查单条 获取不到none) X/ H: B% H, w( s! B" V1 }
user = User.query.first()
' |! J8 w3 H1 {9 L# zuser = User.query.filter(User.username=="小红").first()+ {0 y! h% Y) |1 S; V
user = db.session.query(User).filter(User.username=="小红").first(). n0 G0 X; e: J. n
'''! T# y1 k0 C) P9 z6 h
db.session:是一种更明确的查询语法,适用于更复杂的查询场景,或者在不直接访问模型的情况下执行查询操作: ^& m2 o6 f# N _/ d1 M" ?, L
'''5 O4 Y$ a5 Y( f$ g; `
' _' k+ r; V5 e5 u1 d% o. V, @# 查所有6 }, t' J- _1 w; q0 R
user = User.query.all()$ ]% ]6 T( p4 t2 @1 _" I4 q4 s
user = User.query.filter(User.username=="小红").all()
4 F0 e ]7 ~$ A0 _+ u6 }& uuser = db.session.query(User).filter(User.username=="小红").all()* U1 w3 F* w3 _5 {
7 N4 @8 D0 u/ A
# 只获取单条8 ~1 _& d5 \6 u" T. h7 l
# 结果为一个时正常,多了就报错& u' F9 m% g( j4 Y/ o/ k( T U
# one_or_none() 获取不到报错+ f* [1 v3 m- K* Z# H
user=User.filter(User.username=='小红').one()/ a" ?- ^7 g% Q# t4 S2 D0 P
9 U6 X- l- z# _# x, M9 c+ Y1 K
# 获取不到报错0 z% Y m. v! Z
# get里面需要参数 是id
, P, P9 H3 Q0 Y5 L) I( M' Q% buser = User.query.get(2)
/ Q: p( o) V @: f7 d9 K
! E* G& y) p- Z9 ~
6 u ]$ J. Z# i
! n- F# |9 F* J, e2.条件查询
* v9 V- W5 N9 r" W/ c/ f# 条件查询5 H! S9 _0 ^5 {1 s+ d$ T
user = User.query.filter(User.username=="小红",User.password=="123").first(): j) K! `/ p2 T
# 不等于; t; J5 ~! N6 F8 e- D& |
user = User.query.filter(User.id!=2).all()
2 E1 U4 X' {! m" j) u A' y# 大小于
* [0 @3 R% o+ y9 M y user = User.query.filter(User.id>=2).all() a- z) ]% E+ K; Y7 Y
user = User.query.filter(User.id<=2).all()5 e8 S( p% X* A0 ^
2 t- X# }0 ? b6 l% x
#----------------------------------------6 l" O { X2 U8 _6 C) g+ l
# 结尾为红
2 Z9 t6 F# F7 b/ p; N0 ^User.query.filter(User.name.endswith("红")).all()
o a- H* Z6 _7 yUser.query.filter(User.name.like("%红")).all()
. [+ [6 ?- Z8 y! r, w1 J% V# 开头为小
m/ l& X* J" P0 X# YUser.query.filter(User.name.startswith("小")).all()
) a( D, {. u$ ~2 xUser.query.filter(User.name.like("小%")).all()
( v) b# o$ T( {3 k+ o& \: F8 Y# 包含n mysql语法
; P2 X1 c! A9 }, [3 ~2 a& ?User.query.filter(User.name.contains("n")).all()
" B$ {6 U7 ^ ~ A3 @8 h! HUser.query.filter(User.name.like("%n%")).all() # 模糊查询" d) v; E" Q" M5 \
! m) ^8 P$ q) w0 L$ e( [2 c! m#-----------------------------------------, z/ y" H# n X& a7 n1 f7 |
# 成员属于 in_
7 g. ^! {) k! QUser.query.filter(User.username.in_(['aaa','bbb']).all()' S$ Q# t% O3 z6 I. U3 i
#成员不属于 notin_: n2 F6 X3 X6 C5 u8 V$ ]9 o! N
User.query.filter(User.username.notin_(['aaa','bbb']).all()" C( N: z; u; M, }: }( I u
7 c2 n- i$ d% C$ B8 J
#----------------------------------------! {# m. q3 h3 E1 s- x) O
from sqlalchemy import and_, or_, not_1 H3 e% Y; g6 h( d; Q! I
# 和7 \ I5 c, g6 v
User.query.filter(User.name.startswith('a'), User.email.startswith('q')).all()4 w9 n) e- S) q& M: l3 |* D/ \
User.query.filter(and_(User.name.startswith('a'), User.email.startswith('q'))).all()/ r# l7 B& T5 s0 J! X y, H6 Q
# 或者- e" Y+ C8 W7 v! y. ]
User.filter(or_(User.username=='qaz',User.password=='qwe123')).all()
; F2 x4 O! t9 i N# 非
3 T( a/ F. d5 P: IUser.filter(not_(User.username=='qaz',User.password=='qwe123')).all()
2 l9 b5 p# C& [/ h* T* {* f, E( ]
$ {- i8 \# l C+ w+ i Z! O# _) V#是否空判断 |% n: M; G W" E" m9 F2 w" ]
User.filter(User.username==None).all() )( p5 q! r8 {) @# P* m7 H6 g
User.filter(User.username.is_(None)).all() )6 m% I' t2 U" p4 v% U1 h/ L* T( k4 U
User.filter(User.username.isnot(None)).all() ): s' j3 _. E' \6 b
# [7 D, ^4 A, X" E m
#------------------------------------------
' y4 K' n* _7 I+ n, q# limit 限制返回数据条数
. X% U, b) K+ `6 e+ \4 U1 Y, ?# 开始条数是0
/ n% U5 n- `1 E" l/ m5 TUser.filter(User.gender!=1).limit(2).all())
: r- p" E8 Y5 n# 从第几条开始获取 偏移0 g u. ^" }5 {, T& N D7 w6 s: X& L0 N
User.query.offset(0).all()
; e8 t6 ]. r: k: K# 从第2条数据到第3条 包前不报后' M$ ~( L+ I) s, [' O$ G
User.filter(User.username!='qq').slice(2,3).all())
4 ^& o* v* I8 B7 a* ^, E" o
/ F9 s1 f9 ^9 c& y# 排序 order_by 默认正序9 e* A$ x$ i2 M. y* y y% T* l& |
User.filter(User.username!='aa').order_by(User.username).all()
7 H' q8 j7 W! a" L0 f, A User.filter(User.username!='aa').order_by(User.id.asc()).all() 正序- z0 {% y- f$ L w# Z1 ]3 i
User.filter(User.username!='aa').order_by(User.id.desc()).all() 倒叙
+ R* P% F5 h k, h6 ]% d3 @4 f% Z z+ n! G l, t; q$ j
# 注意:上面的可以随意组合* P3 g, I; A; ~" u( ~. g2 d
# 其余后续补充
7 L" W4 ^8 ^& Z9 F& `, v, D$ U4 T0 M2 B# g
3 F% i; q6 X7 C8 j G' M5 E4 E3.filter和filter_by7 Y" i9 d! Q' Z
filter_by和filter都是过滤条件
$ I& _# K4 b! o* lfilter_by 不支持比较运算符,只能用=
3 ]. Y& L* \; F G% Q1 C( D$ \: y& h" o
# 返回的都是对象* a( G; e% f1 m2 p% `
rows1 = User.query.filter_by(username='小红').all()
$ u1 c+ s: h% N) {( u& C" ?) y1 ?rows2 = User.query..filter(User.username=='小红').all()
; W3 ~2 l1 F2 a; }% L6 \3 T5 r$ S# C( R& ^2 @/ q' k
# rows3 返回的是User的username属性,不是对象) r! L, A8 f! i* [- I; q
rows3 = db.session.query(User.username).filter(User.username=='小红').all()
/ a& ` Y% S* k# w1 ?' f# 返回的是select语句8 l! j7 r. M( Y1 o2 D$ \( q6 z
rows4 = db.session.query(User.username).filter(User.username=='小红')( m! B1 e( p) Z W4 \
7 B/ M* ~3 q) S2 ]
) x) k" g# t# X6.增加 I. t- b+ [6 L3 b/ l
# 单数据增加
. A* o# N* t* D user = User(username="张三",password ="123",email="123@qq.com")9 g5 W3 C1 V7 E. h. E, Y( \, |
db.session.add(user)3 s# h/ F% t9 d6 K1 t; f
db.session.commit()8 A+ m4 x" P, K- d# T9 R
: z, J/ y) M; z- Q+ D* O0 u
#-----------------------------------: ]1 [3 `9 C8 O: l
# 多数据增加! J3 |: y! L; ^; o+ z/ r
# 后面两种可能会有颜色警告1 i# X- U" r$ ]# v2 @0 k
方法一:使用字典列表一次性插入多条数据
, N- I, V+ E3 T) E' t1 l2 L& O@bl_user.route('/index')$ H! _% k! |1 h8 G% o/ W6 m
def index():
0 ^9 ~1 }( g3 r1 J* u, A) J data_list = [/ P1 a5 e& i; y; N
{'username': 'value1', 'password': 'value2'},/ t( F# n. n" ^0 P* s! p
{'username': 'value3', 'password': 'value4'},
! P5 B7 ^1 g1 A: S& Y( m ]. {/ ]( f- w5 I. ` h) `/ J
db.session.bulk_insert_mappings(User, data_list)
1 J/ n! V i `& [ # db.session.bulk_insert_mappings(模型, 数据)8 A, _: N0 u3 d) C" e
db.session.commit()7 {. k, I) q$ m. L. V
return '增加成功'
9 C7 u9 M7 z+ g+ o0 B! N. \ N# K" H5 c9 s- ?) V4 ~6 [' `
方法二:将多个对象一次性保存到数据库8 x0 s# p. T1 t
@bl_user.route('/index')) f# J, Y* X) M
def index():5 _5 d0 C4 `! q/ l0 X
data_list = [# u6 x2 u9 o1 y
User(username='value1', password='value2'),
# Q1 }3 Y2 }% i3 X! a+ ~ User(username='value3', password='value4'),# H+ k" p4 \1 b# q9 i- K6 Q/ I
]
7 a7 b$ K# u% L db.session.bulk_save_objects(data_list)
8 h& d& k0 j+ | db.session.commit()
/ i6 D- X1 q I- G8 P) B return '增加成功'
4 `6 \, t* [9 j' E) ?0 ?
2 v$ r! d( U7 d& f方法三:6 U8 w; k2 B" V. D- d+ C5 E3 o, k
@bl_user.route('/index')- i$ J1 w: C! U. G8 j* G
data_list = [
( M5 z) F( s) {8 Q9 B# ^' }- X {'username': 'value1', 'password': 'value2'},1 I3 s `2 {# {' S+ s3 L2 S
{'username': 'value3', 'password': 'value4'},( H& l4 m6 x3 w% m; o% m( \% ]& ^
]( N$ i5 U( R9 K7 c$ Y/ `
j# r; ? O8 F2 d$ \- c: B data_objects = [User(**data) for data in data_list]
. \7 ?2 i' f- F$ T P, C db.session.add_all(data_objects)
$ K2 Z J0 K* o db.session.commit()
5 h) a1 l* `, O: I. m5 i return '增加成功'. \5 P+ B9 m: h. R8 S
' a) [. ~0 X# g8 D2 s* H
# |2 a9 \$ q- v9 Z7 [7.修改
" {0 v! B* ?0 R. g方法一:先查询后修改 可能会丢失数据
4 l& O3 L8 e- ]4 V9 Ruser = User.query.filter(User.username=="小红").first()5 q, a* |6 Q" u2 W; ]2 o9 F7 f6 S
user.email = "abc@163.com"0 i0 V- v1 h( F1 d
db.session.commit()' m5 L6 u9 m! S. P
$ M/ s I3 T$ Z% R4 a8 {
方法二:直接修改 推荐- Y# w) t9 b2 Q. b; y
User.query.filter(User.username == 'qqqq').update({'email': 'ABC@qq.com'})
2 F) W& V0 K; ?& cdb.session.commit()
5 c) q3 \9 A e$ C
$ \5 A* h, |! [! i#--------------------------* G% P) h' Q* e5 A n2 I( H1 a( U
# 批量修改 列表套字典1 h: I g. V Z. c# K
# 注意必须要有id 确定修改那一条9 s0 R4 l i! z; ]6 A( Z8 m
user = User.query.filter(User.id == 1).first()1 j& E7 W8 [( W# m' S4 k& E
data = [{'id': user.id, 'username': 'zzzzz', 'password': '12345678'},, G( P% |9 ?1 P) i
{'id': 2, 'username': 'aaa', 'password': 'zxcv'}]& J5 K) u" L# ~2 |' D4 A
db.session.bulk_update_mappings(User, data)
; k/ X5 m7 X# ~9 t+ } db.session.commit()! P- h0 E; m/ H
' g# K) T1 N2 P8 q
6 h2 q2 _7 A2 v& ?: [8.删除5 Q( h6 h8 I" b( C2 K+ a
方法一:先查询后删除 推荐! m4 }! \7 r5 ~5 P
user = User.query.filter(User.username=="小红").first()
; @+ Z; d# E9 N3 `) s5 Ldb.session.delete(user)
+ l$ R+ d- f9 D/ p2 y- vdb.session.commit() t" @- f6 H% {0 }
- w" v9 j" r9 w
方法二:直接删除 可以删除多个
* X1 H) l4 _( g$ T: Y# wuser = User.query.filter(User.id == 2).delete(); {! `, e8 h0 W* [- @, f+ |
db.session.commit()
i5 \4 G2 U: |
" w9 A+ ]0 D& `% O e# 假设有多个xxx 那么就可以把xxx全部删除
: S: W& ]& |8 a5 ^user = User.query.filter(User.username== "xxx").delete()! x8 a }$ j# u$ i
db.session.commit()" ]: ]0 Y5 g7 X0 r; z9 ^$ N% p2 s
cv'}]
8 j0 S1 R2 [, Z0 o& J* |: k# x db.session.bulk_update_mappings(User, data)
; r! z7 H3 f1 V# C F7 f( I1 n db.session.commit()- X) V& ]$ r! ~+ m( L
! S9 d/ z3 c7 V9 \* E* n& K8 `$ _, A
6 u8 ^! \ v* w- r4 A" |5 n8.删除
0 ^7 |, D0 t( F: j! }7 R; P方法一:先查询后删除 推荐
4 n: Y/ r* R& O6 W g/ q& Fuser = User.query.filter(User.username=="小红").first()+ q" @& E9 J4 ?$ \# X
db.session.delete(user)
- J# K3 O3 A9 o1 Z5 D, hdb.session.commit()# T' ]. b1 K" B3 @4 ?& O
, y( h8 m4 ]6 x6 B) w4 G方法二:直接删除 可以删除多个4 F5 q0 R( K- V( K* u3 @6 [
user = User.query.filter(User.id == 2).delete()
6 `& _0 Q' A8 L4 }1 gdb.session.commit()) ~$ \) j/ \0 p3 w% A$ D% w1 d
5 W2 A/ M) H. C7 I# 假设有多个xxx 那么就可以把xxx全部删除: z ?) R Q9 d- v8 ^- x/ `" J! ?: M
user = User.query.filter(User.username== "xxx").delete()
7 i' i6 l1 f' Y/ l- l0 C6 g* ydb.session.commit()! R$ A, N3 i0 A7 e- K X
+ [" t; W9 l. J) D% @6 o
+ @* [+ N/ ^) g6 v# H6 {. ?* {% t |
|