python sqlalchemy更簡單的用法

前期我發表過一篇文章:python sqlalchemy的簡單用法,後來又看了很多sqlchemy的新版本文檔,發現自己那篇文章裏講的方法很多代碼都是畫蛇添足,還有更簡單的用法。

我們應用的場景依然是你的數據庫表是已經建立好的,只是想用python操作數據庫(增、刪、查、改等),但不涉及建表、主外鍵關係等內容(因爲這些內容一般都是直接用SQL)。

類的映射

比如我用來存儲用戶信息的sqlite數據庫 (test.db) 結構是這樣的:

create table if not exists users (
    id integer primary key,
    name varchar(20),
    password varchar(20)
);

sqlalchemy 0.9.1 之後增加了一種automap_base的機制,可以使現成的數據庫中的數據結構反射到類上。用來訪問上述數據庫中的表只需要簡單幾句就可以完成映射:

import sqlalchemy
from sqlalchemy.orm import Session
from sqlalchemy.ext.automap import automap_base
if __name__ == "__main__":
    engine_str = 'sqlite:///:test.db'
    engine = sqlalchemy.create_engine(engine_str)
    session = Session(engine)
    # 下面這兩句話就完成了ORM映射 Base.classes.XXXX即爲映射的類
    # Base.metadata.tables['XXX']即爲相應的表
    Base = automap_base()
    Base.prepare(engine, reflect = True)
    # 查詢操作
    result = session.query(Base.classes.users).all()
    # 插入操作
    item = Base.classes.users(name='lxq', password='1234')
    session.add(item)
    session.commit()
    
    session.close()


簡單定義了兩個類之後,不用關心數據表的內部實現,sqlalchemy會實現自動的映射,隨後手冊上的很多操作都可以正常使用了。

數據修改

ORM系統對數據庫中訪問到的每一行數據會映射爲一個唯一的Table對象,因此,當需要對數據修改的時候,找到這行數據然後直接改其元素然後commit即可。
ed_user = session.query(User).filter_by(name='ed').first()
ed_user.name = 'love'
session.commit()

批量插入

利用單純的ORM方式進行大批量的插入數據,由於是調用多條INSERT語句,因此效率十分低下,session.add_all函數實際上也是調用了多條INSERT語句,如果想批量插入數據,可以進行如下處理:
engine.execute(User.__table__.insert(), 
    [{'name':'hello', 'password':'1234'},
    {'name':'hello2', 'password':'1234'}])

MISC-lazy connecting
create_engine 按照手冊上的說法是lazy_connecting,當你在create_engine的時候並不會真正的建立數據庫連接,而當第一次進行數據庫相關操作的時候纔會真正建立連接。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章