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带了一些函数功能,有countsumavg
    这里用的是count求数量的功能,求出type为1的共有多少个
  • group_by是分组的功能,以括号里的type为标准分组,起到了去重的作用
  • filter是查找userRose的记录

官方文档:
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的使用/

http://cold-sunset.com/blog/2

https://flask-migrate.readthedocs.io/en/latest/

如何支持 emoji 表情

数据库如果要支持emoji,首先编码得是utf8mb4utf8不行

但我的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/

posted @ 2018-01-30 17:13  宫内莲华x  阅读(187)  评论(0编辑  收藏  举报