SQLAlchemy
管理两个数据库
如果一个Flask项目的数据需要放在两个不同的数据库
如何使用SQLAlchemy进行操作?
在定义数据库路径的时候绑定第二个数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 数据库1路径
app.config['SQLALCHEMY_BINDS'] = {
'数据库2名称': 数据库2路径
}
在定义表的时候带上bind_key
class Version(db.Model):
__bind_key__ = '数据库2名称'
__tablename__ = 'version'
在初始化数据库的时候带上--multidb
参数
python app.py db init --multidb
python app.py db migrate
python app.py db upgrade
就能同时管理两个数据库了,没有什么区别
分组并统计每组的数量
工作上有个需求,现在有一组这样的数据
l = [
{
"id": 1,
"type": 1,
"user": "Jack",
},
{
"id": 2,
"type": 1,
"user": "Rose",
},
{
"id": 3,
"type": 1,
"user": "Rose",
},
{
"id": 4,
"type": 2,
"user": "Rose",
},
]
首先把属于Rose
的东西拿出来,有三个
然后把type
相同的合并,只要数量
于是会变成下面这个样子,用一个amount
来表示数量
l = [
{
"amount": 2,
"id": 2,
"type": 1,
"user": "Rose",
},
{
"amount": 1,
"id": 4,
"type": 2,
"user": "Rose",
},
]
第一种方式取出来的数据,用python去处理也可以,但写得有点难看
所以我想这种事情数据库应该可以做,就去找了资料
from sqlalchemy import func
ts = db.session.query(Table.type, func.count(Table.type)).group_by(Table.type).filter(Table.user == "Rose").all()
返回的东西是这个样子,第一个数是type
,第二个数是amount
第一个元组表示type
为1的数量有两个,第二个元组表示type
为2的数量有一个
[(1, 2), (2, 1)]
拿到这个以后问题基本解决了,剩下用python代码实现
现在解释一下查找步骤的具体意义
func
带了一些函数功能,有count
、sum
、avg
等
这里用的是count
求数量的功能,求出type
为1的共有多少个group_by
是分组的功能,以括号里的type
为标准分组,起到了去重的作用filter
是查找user
为Rose
的记录
官方文档:
http://www.pythondoc.com/flask-sqlalchemy/api.html#flask.ext.sqlalchemy.SQLAlchemy.Query
参考文档:
这篇比较好,但页面的线条效果简直魔性
https://wing324.github.io/2017/02/25/使用flask-sqlalchemy玩转MySQL/
这个回答刚好解决了我的问题
https://stackoverflow.com/questions/1052148/group-by-count-function-in-sqlalchemy
https://github.com/lzjun567/note/blob/master/note/python/sqlalchemy.md
http://www.jianshu.com/p/8d085e2f2657
default 的问题
下面这样的default
其实没有用,或者说没起到我想要的作用
name = db.Column(db.String(10), default='')
在表里新增一个字段后,数据里这个新增字段的值都为null
,这个default
在这里就没用
而我想让它新增之后不为null
有一个默认值,可以这么做
name = db.Column(db.String(10), server_default='')
新增的字段的默认值就为一个空字符串
注意
如果字段是整数,不能直接写server_default=0
这样会报错,应该是server_default='0'
,出来的默认值就是0
并且默认值里不能有中文,server_default='你好'
这样也会报错,但我觉得数据库应该可以设置好了这个中文编码问题
Flask-Migrate 资料
http://www.tuvary.com/2017/08/03/cjb58hpua0000f4fuilwri98b/
http://wing324.github.io/2017/02/26/Flask-Migrate的使用/
https://flask-migrate.readthedocs.io/en/latest/
如何支持 emoji 表情
数据库如果要支持emoji,首先编码得是utf8mb4
,utf8
不行
但我的MySQL已经是了utf8mb4
,存进去的还是四个问号
查了才发现,SQLAlchemy需要指定编码,鬼知道是什么编码用到现在 : )
指定方式
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+{DRIVER}://{USER}:{PASSWORD}@{HOST}:{PORT}/{NAME}?charset=utf8mb4'.format(**db_config)
?charset=utf8mb4
是新加的,刷新就能用了
资料:
https://hukaixuan.github.io/2017/04/10/flask-+-sqlalchemy-存储emoji/
http://zhangming0509.github.io/2016/02/24/mysql-emoji/