<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
說到物件導向,大家都不陌生。關係型資料庫也是後端日常用來儲存資料的,但資料庫是關係型的,因此,ORM通過物件模型和資料庫的關係模型之間建立對映,我們就能像操作物件一樣來運算元據庫。 ORM的優點主要是物件導向程式設計,不需寫原生SQL,用操作物件的方式存取資料。當然,缺點就是當遇到複雜的操作時,ORM就不那麼好寫了,還有就是加了一層對映,執行效率低於原生sql。不過,對於大部分專案來說,這些缺點都是可以接受的。犧牲的效能可以接受;有複雜操作時,實現就用原生SQL,ORM執行罷了。
在python中,常用的ORM工具就是sqlalchemy了。下面就以一個簡單的flask例子來說明吧。
首先,寫一個最簡單的flask專案,程式碼如下:
from flask import Flask app = Flask(__name__) @app.route('/') def orm_test(): return "hello"
接下來我們匯入ORM設定,新增如下程式碼:
from flask_sqlalchemy import SQLAlchemy def orm_config(): url = "mysql+mysqlconnector://{user}:{pwd}@{host}:{port}/{db_name}?charset=utf8" orm_conf = { 'SQLALCHEMY_DATABASE_URI': url } return orm_conf # ORM 設定 app.config.from_mapping(orm_config) db = SQLAlchemy(app)
這樣我們就將ORM設定OK了。
# model表名 class Table1(db.Model): # 表名 __tablename__ = "table1" id = db.Column(db.Integer, primary_key=True) col = db.Column(db.String(64), nullable=False, unique=True, comment='欄位釋義')
以上設定這是在資料來源只有一個庫的時候,但很多時候我們還需要存取別的庫,這時需要在ORM設定和model上做一些設定。
ORM設定中需要用到SQLALCHEMY_BINDS
來新增資料庫, model中__bind_key__
來指定資料庫了。
具體修改如下:
修改ORM設定:
def orm_config(): url = "mysql+mysqlconnector://{user}:{pwd}@{host}:{port}/{db_name}?charset=utf8" # 指定的別庫 other_url = "mysql+mysqlconnector://{user1}:{pwd1}@{host1}:{port1}/{db_name1}?charset=utf8" orm_conf = { 'SQLALCHEMY_DATABASE_URI': url, # 新增別庫 "SQLALCHEMY_BINDS":{ "other_db":other_url }, } return orm_conf
表model指定庫:
class Table2(db.Model): # 指定別庫 __bind_key__ = 'other_db' __tablename__ = "table2" id = db.Column(db.Integer, primary_key=True) col = db.Column(db.String(64), nullable=False, unique=True, comment='欄位釋義')
最後,我們在介面中使用下ORM。
@app.route('/') def orm_test(): # 查詢table1資料 rows = Table1.query.filter(Table1.id<5) res = [] for row in rows: dict = { "id": row.id, "col": row.col } res.append(dict) return "hhh"
當我們遇到複雜操作,不知道ORM語法該怎麼寫時,還可以直接用原生sql + ORM session execute的方式執行,範例如下:
sql = "select count(*) as cnt from table1 group by col" rows = db.session.execute(sql)
以上例子我們是查詢table1表的id<5的資料。
完整程式碼如下:
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) def orm_config(): url = "mysql+mysqlconnector://{user}:{pwd}@{host}:{port}/{db_name}?charset=utf8" other_url = "mysql+mysqlconnector://{user1}:{pwd1}@{host1}:{port1}/{db_name1}?charset=utf8" orm_conf = { 'SQLALCHEMY_DATABASE_URI': url, "SQLALCHEMY_BINDS":{ "other_db":other_url }, } return orm_conf # ORM 設定 app.config.from_mapping(orm_config) db = SQLAlchemy(app) # model表名 class Table1(db.Model): # 表名 __tablename__ = "table1" id = db.Column(db.Integer, primary_key=True) col = db.Column(db.String(64), nullable=False, unique=True, comment='欄位釋義') class Table2(db.Model): # 指定庫 __bind_key__ = 'other_db' __tablename__ = "table2" id = db.Column(db.Integer, primary_key=True) col = db.Column(db.String(64), nullable=False, unique=True, comment='欄位釋義') @app.route('/') def orm_test(): # 查詢table1資料 rows = Table1.query.filter(Table1.id<5) res = [] for row in rows: dict = { "id": row.id, "col": row.col } res.append(dict) return "hhh" if __name__ =="__main__": app.run()
剛開始接觸sqlalchemy時,對於語法不熟悉,寫程式碼也是比較痛苦的。這裡總結下sqlalchemy常用的語法吧。
# 查詢id<5的資料 q = Table1.query.filter(Table1.id<5) # 查詢過濾用 and、or from sqlalchemy import and_, or_ q = Table1.query.filter(and_(Table1.id<5, Table1.col=='掘金')) q = Table1.query.filter(or_(Table1.id<5, Table1.col=='掘金')) # 查詢過濾用in(語法:model.{欄位名}.in_({列表})) q = Table1.query.filter(Table1.id.in_([1,2,3])) # 連表查詢 q = Table1.query.join(Table2, Table2.id==Table1.id) .filter(Table1.id<5) # 解析資料 res = {'data': [dict(i) for i in q]} # 查詢資料count count = q.count()
row = Table1(id=1, col='掘金') db.session.add(row) db.seesion.commit()
row = Table1.query.filter(Table1.id<5) update_data = {"col": "掘金"} row.update(update_data) db.session.commit()
row = Table1.query.filter(Table1.id<5) row.delete() db.session.commit()
備註: 增刪改都要commit()
我們在工程程式碼中使用sqlalchemy時,在設定時記得根據實際情況新增相關設定引數,比如連線池的數量、自動回收連線的秒數等等。
到此這篇關於Python flask sqlalchemy的簡單使用及常用操作的文章就介紹到這了,更多相關Python flask sqlalchemy內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45