DButils
- pip install DBUtils
pooledDB
提供线程间可共享的数据库连接,并自动管理连接,创建好一批连接池,供所有线程共享使用。总数就那么多个。
创建方式
1 | import pymysql |
persistentDB
提供线程专用的数据库连接,并自动管理连接。:为每一个进来的线程创建一个连接,
线程即使调用close也不会关闭,只是把连接重新放到连接池,供自己线程再次使用,
当线程终止时连接自动关闭。(但限制了创建的上线,达到上线就必须等待线程关闭后
再创建新的)
1 | import pymysql |
基于pooledDB的实例
1 | class MySQL(object): |
orm
sqlAlchemy
基本使用操作
pip install sqlachemy
- 示例一:基本数据库连接操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37import time
import datetime
import sqlalchemy
import threading
from _thread import get_ident
from sqlalchemy import create_engine
from sqlalchemy.engine.base import Engine
from pymysql.cursors import DictCursor
engine = create_engine(
"mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8",
max_overflow=2, # 超过连接池大小外最多创建的连接
pool_size=5, # 连接池大小
pool_timeout=30, # 连接池等待时间
pool_recycle=-1 # 多久后对线程池中的线程进行一次连接回收
)
def task(args):
conn = engine.raw_connection()
cursor = conn.cursor(DictCursor)
cursor.execute(
# 'select * from bb'
'select sleep(2)'
)
results = cursor.fetchall()
print(args, get_ident(), results)
cursor.close()
conn.close()
task(-1)
for i in range(20):
t = threading.Thread(target=task, args=(i, ))
t.start()
- 示例二:orm映射
1 | import datetime |
sqlachemy的缺陷
1.不像django一样makemigrate、migrate就可以生成表,如果要生成定义类的表,需要自定义init_db()
2.不能修改表,只能自己给数据库加字段后,在类的关系映射上修改对象加上一个属性。
3.但我们可以创造类似django的功能脚本嘛(flask-migrate)
1 | class Users(Base): |
sessionMaker和scopeSession
1 | from sqlalchemy.orm import sessionmaker |
- scope_session和session对象的区别:
scope使用threading.local为每个线程创建一个session,其实原session每个线程
进去就实例化一个新的也是可以的。通过scope就只需要为每个线程实例化一个。
基本增删改查
增加&批量增加
1 | Session = sessionmaker(bind=engine) |
查&过滤查找
1 | Session = sessionmaker(bind=engine) |
删除
先查询再删除
1 | user_search = conn.query(Users).filter(Users.id > 2).delete() |
修改
1 | user_search = conn.query(Users).filter(Users.id == 1).update({'name':'axasfcas'}) |
修改数字
时需要修改执行策略,synchronize_session=”evaluate”
范围查找
1 | # _*_ coding: utf-8 _*_ |
order by和group by
1 | # 排序 |
联表查询
1 | res = conn.query(Users, Favor).filter(Users.id == Favor.uid).all() |
组合union
1 | from sqlalchemy.orm import scoped_session |
如何把session.execute()中返回的元组转化为dict
观察可以发现返回的单一对象是querycollection的对象,它们有方法keys,所以可以
通过dict(zip(obj.keys(), obj))绑定连表查询手动
一对一、一对多
1 | import datetime |
flask sqlalchemy
- db中的对象:
- 1.db.Models 其中Models相当于from sqlalchemy.ext.declarative import declarative_base
- 2.db.Integer/String…. 字段
- 3.db.create_all()/drop_all() metadata
- 4.db.session scoped_session(其中有threading.local区别线程)
- 5.db.init_app(app)必须读配置文件连接数据库
初始化db
1 | # settings.py |
- 注意:
- 1.flask sqlalchemy必须在flask基础上做,必须加载app的config进db。
- 2.如果db和model没有在一个py,需要model到导入db加载到内存才能生成表,这也方便了我们控制(和蓝图比较相似)
flask-script
用于实现django python manager.py runserver这种脚本
1 | pip install flask-script |
- 创建离线脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17@manager.command
def test01(args):
"""python app.py test01 args"""
with app.app_context():
conn = db.session
@manager.option('-n', '--name', dest='name')
@manager.option('-u', '--url', dest='url')
def test02(name, url):
"""python app.py test02 -n xxx -u xxx"""
with app.app_context():
conn = db.session
if __name__ == '__main__':
manager.run()
flask-migrate
flask不支持修改表,增加列,如果要增加需要删除掉原表重新生成,这样原数据就无了,
也可以手动增加,或者就是用migrate(设计者认为该表不是安全可行的操作)
1 | from flask_sqlalchemy import SQLAlchemy |