Sqlalchemy ORM

本文主要Sqlalchemy的ORM components進行介紹
參考:SQLAlchemy 1.4 Documentation(中文版)

基本架構(gòu)

SQLAlchemy由幾個組件組成啃洋,包括SQL expression language和ORM褂乍。
為了實現(xiàn)這些組件跨扮,SQLAlchemy還提供了一個Engine類和MetaData類袒炉。

  • Engine--管理SQLAlchemy連接池和獨立于數(shù)據(jù)庫的SQL方言層孕荠。
  • MetaData - 用于收集和組織有關(guān)您的表布局(數(shù)據(jù)庫模式)的信息闺金。
  • SQL expression language--提供了一個API來對你的表執(zhí)行查詢和更新县忌。
    所有這些都來自Python鳞骤,而且都是以一種獨立于數(shù)據(jù)庫的方式筷畦。(本文不作介紹)
  • ORM - 提供了一種方便的方式來為你的Python對象添加數(shù)據(jù)庫持久性词裤,而不需要再添加其他的功能。

ORM創(chuàng)建表格

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base


# 建立一個引擎對象鳖宾,如果數(shù)據(jù)庫不存在吼砂,將創(chuàng)建數(shù)據(jù)庫,下面以sqlite為例
engine = create_engine("sqlite:///test.db", echo=True)
# 創(chuàng)造基類的實例鼎文,通常只會有一個實例渔肩,建議做單例模式
Base = declarative_base(bind=engine)


class Customers(Base):
    """在Base的基礎(chǔ)上定義映射類

    Args:
        Base : 基類
    """    
    __tablename__ = 'customers'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    address = Column(String)
    email = Column(String)


def create_table():
    """創(chuàng)建還沒有被創(chuàng)建的表
    """    
    Base.metadata.create_all() 

獲取交互句柄

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine("sqlite:///test.db", echo=True)

def get_session():
    """獲取與數(shù)據(jù)庫交互的句柄

    Returns:
        與數(shù)據(jù)庫交互的句柄
    """    
    Session = sessionmaker(bind=engine)
    session = Session()
    return session

數(shù)據(jù)庫操作

以新增customer為例

def add_customer(**kwargs):
    c = Customers(**kwargs)
    session = get_seesion()
    session.add(c)
    session.commit()
    session.close()
    return c

add_customer(name='xiaofan', address='xiaozhufeng', email='xiaofan@163.com')
其它常用操作
  • add_all()
  • query()
session.query(Customers).all()  # return list

session.query(Customers).first()  # return scalar
 # 超過一個報錯“MultipleResultsFound”, 少于一個報錯“NoResultFound”
session.query(Customers).filter(Customers.id == 1).one()   # retrun scalar

  • filter()
# return list
session.query(Customers).filter(Customers.name=='yasin')  # ==
session.query(Customers).filter(Customers.id>2)  # >
session.query(Customers).filter(Customers.name.like('Ra%'))  # like
session.query(Customers).filter(Customers.id.in_([1,3]))  # in
session.query(Customers).filter(Customers.id>2,
Customers.name.like('Ra%'))  # and
session.query(Customers).filter(and_(Customers.id>2,
Customers.name.like('Ra%')))  # and
session.query(Customers).filter(or_(Customers.id>2,
Customers.name.like('Ra%')))  # or
  • scalar()
session.query(Customers).filter(Customers.id==3).scalar()  # 僅當(dāng)len(list)=1時有效
  • update()
session.query(Customers).filter(Customers.id!=2).update({Customers.name:"Mr."+C
ustomers.name}, synchronize_session=False)

Textual SQL

  • filter中使用SQL查詢語句
from sqlalchemy import text

session.query(Customers).filter(text("id<3"))
session.query(Customers).filter(text("id=:value")).params(value=1).one()
  • 純SQL語句查詢
session.query(Customers).from_statement(text("SELECT * FROM customers")).all()

stmt = text("SELECT name, id, name, address, email FROM customers")
# name, id 對應(yīng)鏈接到了Customers.id和Customers.name拇惋,互換了
stmt=stmt.columns(Customers.id, Customers.name) 
session.query(Customers.id, Customers.name).from_statement(stmt).all()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末周偎,一起剝皮案震驚了整個濱河市抹剩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蓉坎,老刑警劉巖吧兔,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異袍嬉,居然都是意外死亡境蔼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門伺通,熙熙樓的掌柜王于貴愁眉苦臉地迎上來箍土,“玉大人,你說我怎么就攤上這事罐监∥庠澹” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵弓柱,是天一觀的道長沟堡。 經(jīng)常有香客問我,道長矢空,這世上最難降的妖魔是什么航罗? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮屁药,結(jié)果婚禮上粥血,老公的妹妹穿的比我還像新娘。我一直安慰自己酿箭,他們只是感情好复亏,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缭嫡,像睡著了一般缔御。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妇蛀,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天耕突,我揣著相機與錄音,去河邊找鬼讥耗。 笑死有勾,一個胖子當(dāng)著我的面吹牛疹启,可吹牛的內(nèi)容都是我干的古程。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼喊崖,長吁一口氣:“原來是場噩夢啊……” “哼挣磨!你這毒婦竟也來了雇逞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤茁裙,失蹤者是張志新(化名)和其女友劉穎塘砸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晤锥,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡掉蔬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矾瘾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片女轿。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖壕翩,靈堂內(nèi)的尸體忽然破棺而出蛉迹,到底是詐尸還是另有隱情,我是刑警寧澤放妈,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布北救,位于F島的核電站,受9級特大地震影響芜抒,放射性物質(zhì)發(fā)生泄漏珍策。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一宅倒、第九天 我趴在偏房一處隱蔽的房頂上張望膛壹。 院中可真熱鬧,春花似錦唉堪、人聲如沸模聋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽链方。三九已至,卻和暖如春灶搜,著一層夾襖步出監(jiān)牢的瞬間祟蚀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工割卖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留前酿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓鹏溯,卻偏偏與公主長得像罢维,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子丙挽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容