日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQLAlchemy

發布時間:2025/3/15 数据库 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 functs = 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/%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,首先編碼得是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-%E5%AD%98%E5%82%A8emoji/
http://zhangming0509.github.io/2016/02/24/mysql-emoji/

轉載于:https://www.cnblogs.com/xb21/p/8386062.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的SQLAlchemy的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。