SQLAlchemy

Posted xb21

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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/%E4%BD%BF%E7%94%A8flask-sqlalchemy%E7%8E%A9%E8%BD%ACMySQL/

这个回答刚好解决了我的问题
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%E7%9A%84%E4%BD%BF%E7%94%A8/

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-%E5%AD%98%E5%82%A8emoji/
http://zhangming0509.github.io/2016/02/24/mysql-emoji/
















以上是关于SQLAlchemy的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy的同步和异步的代码对比

SQLAlchemy的同步和异步的代码对比

SQLAlchemy的同步和异步的代码对比

SQLAlchemy:数据库创建代码小于数据库

python SQLAlchemy 缓存问题

python SQLAlchemy 缓存问题