SQLAlchemy學(xué)習(xí)筆記(二)

創(chuàng)建會(huì)話

我們現(xiàn)在準(zhǔn)備去和數(shù)據(jù)庫進(jìn)行交互。ORM操作數(shù)據(jù)庫的工具就是session,當(dāng)我們第一次設(shè)置應(yīng)用程序杆查,和create_engin()在同一個(gè)級(jí)別的,我們定義一個(gè)Session類臀蛛,這個(gè)是一個(gè)工廠為我們產(chǎn)生Seesion對(duì)象亲桦。

>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker(bind=engine)

我們可以發(fā)現(xiàn)我們的sessionmaker()方法有一個(gè)bind的參數(shù)。當(dāng)你的應(yīng)用在沒有Engine時(shí)浊仆,在你定義你的模型級(jí)對(duì)象是只需要像下面這樣定義:

>>>Session = sessionmaker()

在這之后客峭,當(dāng)你創(chuàng)建了你的引擎create_engine(),想讓引擎連接到會(huì)話上,可以使用configure():

>>> Session.configure(bind=engine)

這個(gè)定制的Session類將創(chuàng)建綁定到我們數(shù)據(jù)庫的新的Session對(duì)象抡柿。當(dāng)調(diào)用sessionmaker時(shí)候也可以定義其他的事物特征舔琅,之后的內(nèi)容會(huì)講到。然后洲劣,每當(dāng)需要與數(shù)據(jù)庫進(jìn)行對(duì)話時(shí)备蚓,都會(huì)實(shí)例化一個(gè)會(huì)話Session:

>>> session = Session()

上面我們的Session和我們的數(shù)據(jù)庫引擎想關(guān)聯(lián),但是它沒有打開任何的數(shù)據(jù)庫連接囱稽。
當(dāng)它第一次使用時(shí)郊尝,它從引擎維護(hù)的連接池檢索連接,并保持這個(gè)款連接战惊,直到我們提交所有更改或關(guān)閉會(huì)話對(duì)象流昏。

添加、更新一個(gè)對(duì)象

為了持久化我們的User對(duì)象样傍,我們將使用add()將它添加到會(huì)話中:

>>>yu_user = User(name="yu", fullname="yuziyong", password="123")
>>> session.add(yu_user)

此刻横缔,我們可以說這個(gè)實(shí)例是持久化的,
沒有任何SQL語句執(zhí)行衫哥,并且對(duì)象尚未由數(shù)據(jù)庫中的行表示茎刚。這個(gè)Session將會(huì)在需要時(shí)發(fā)出SQL持久化yuziyong,使用一個(gè)稱之為刷新的過程。如果我們查找數(shù)據(jù)庫中的"yuziyong",所有持久化的信息將首先被刷新撤逢,并立即發(fā)出查詢膛锭。
下面舉個(gè)例子粮坞,我們創(chuàng)建一個(gè)新的查詢,加載User實(shí)例初狰,我們使用name進(jìn)行過濾出名字為ricky的結(jié)果莫杈,
并指出我們只想獲取完整列表中的第一個(gè)結(jié)果。返回一個(gè)等效于我們添加的用戶實(shí)例:

>>> >>> our_user = session.query(User).filter_by(name="yu").first()
2017-03-08 22:31:13,130 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (%(name)s, %(fullname)s, %(password)s) RETURNING users.id
2017-03-08 22:31:13,130 INFO sqlalchemy.engine.base.Engine {'fullname': 'yuziyong', 'password': '123', 'name': 'yu'}
2017-03-08 22:31:13,130 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
WHERE users.name = %(name_1)s
 LIMIT %(param_1)s
2017-03-08 22:31:13,130 INFO sqlalchemy.engine.base.Engine {'name_1': 'yu', 'param_1': 1}

事實(shí)上奢入,Session已經(jīng)識(shí)別出返回的行與在其內(nèi)部對(duì)象映射中已經(jīng)表示的行是相同的行筝闹,所以我們實(shí)際上得到了與剛才添加的相同的實(shí)例。

>>> our_user is yu_user
True

我們還可以使用add_all()來一次往session中添加多個(gè):

>>> session.add_all([
...     User(name='wendy', fullname='Wendy Williams', password='foobar'),
...     User(name='mary', fullname='Mary Contrary', password='xxg527'),
...     User(name='fred', fullname='Fred Flinstone', password='blah')])

現(xiàn)在我們決定改變yu的密碼:

>>> yu_user.password='000'

Session會(huì)注意到變化腥光,例如:它知道yu的密碼被修改:

>>> session.dirty
IdentitySet([<User(name=yu, fullname=yuziyong, password=000)>])
>>>

現(xiàn)在三個(gè)新的對(duì)象正在等待:

>>> session.new  
IdentitySet([<User(name='wendy', fullname='Wendy Williams', password='foobar')>,
<User(name='mary', fullname='Mary Contrary', password='xxg527')>,
<User(name='fred', fullname='Fred Flinstone', password='blah')>])

我們告訴Session,我們想要對(duì)數(shù)據(jù)庫發(fā)出所有剩余的更改并提交事務(wù)关顷,使用session.commit()

>>> session.commit()

commit()清除數(shù)據(jù)庫中剩余的任何更改,并提交事務(wù),會(huì)話引用的連接資源現(xiàn)在返回到連接池武福。

事物回滾

由于會(huì)話在一個(gè)事務(wù)中工作议双,我們可以回滾更改。讓我們做兩個(gè)更改捉片,我們將還原yu_user的用戶名設(shè)置為ziyong.

>>> yu_user.name = 'ziyong'

然后我們添加一個(gè)新的非法的用戶:

>>> fake_user = User(name='fakeuser', fullname='Invalid', password='12345')
>>> session.add(fake_user)

查詢會(huì)話平痰,我們可以看到它們被刷入當(dāng)前事務(wù):

>>> session.query(User).filter(User.name.in_(['Edwardo', 'fakeuser'])).all()
2017-03-08 22:53:58,535 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2017-03-08 22:53:58,535 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.fullname AS users_fullname, users.password AS users_password
FROM users
WHERE users.id = %(param_1)s
2017-03-08 22:53:58,535 INFO sqlalchemy.engine.base.Engine {'param_1': 6}
2017-03-08 22:53:58,535 INFO sqlalchemy.engine.base.Engine UPDATE users SET name=%(name)s WHERE users.id = %(users_id)s
2017-03-08 22:53:58,535 INFO sqlalchemy.engine.base.Engine {'users_id': 6, 'name': 'ziyong'}
2017-03-08 22:53:58,535 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (%(name)s, %(fullname)s, %(password)s) RETURNING users.id
2017-03-08 22:53:58,535 INFO sqlalchemy.engine.base.Engine {'fullname': 'Invalid', 'password': '12345', 'name': 'fakauser'}
2017-03-08 22:53:58,535 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
WHERE users.name IN (%(name_1)s, %(name_2)s)
2017-03-08 22:53:58,535 INFO sqlalchemy.engine.base.Engine {'name_2': 'fakeuser', 'name_1': 'Edwardo'}
[]

回滾,我們能看到yu_user的名字回滾為yu,并且剛添加的非法用戶也沖會(huì)話中刪除伍纫。

>>> session.rollback()
2017-03-08 22:57:44,322 INFO sqlalchemy.engine.base.Engine ROLLBACK
>>> yu_user.name
2017-03-08 22:57:51,135 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2017-03-08 22:57:51,135 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
WHERE users.id = %(param_1)s
2017-03-08 22:57:51,135 INFO sqlalchemy.engine.base.Engine {'param_1': 6}
u'yu'
>>> fake_user in session
False
>>>

再次查詢:

>>> session.query(User).filter(User.name.in_(['yu', 'fakeuser'])).all()
2017-03-08 23:01:47,980 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
WHERE users.name IN (%(name_1)s, %(name_2)s)
2017-03-08 23:01:47,980 INFO sqlalchemy.engine.base.Engine {'name_2': 'fakeuser', 'name_1': 'yu'}
[<User(name=yu, fullname=yuziyong, password=000)>]
待續(xù)宗雇。。翻斟。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逾礁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子访惜,更是在濱河造成了極大的恐慌嘹履,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件债热,死亡現(xiàn)場(chǎng)離奇詭異砾嫉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)窒篱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門焕刮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人墙杯,你說我怎么就攤上這事配并。” “怎么了高镐?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵溉旋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我嫉髓,道長(zhǎng)观腊,這世上最難降的妖魔是什么邑闲? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮梧油,結(jié)果婚禮上苫耸,老公的妹妹穿的比我還像新娘。我一直安慰自己儡陨,他們只是感情好褪子,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著迄委,像睡著了一般褐筛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叙身,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音硫狞,去河邊找鬼信轿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛残吩,可吹牛的內(nèi)容都是我干的财忽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼泣侮,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼即彪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起活尊,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤隶校,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后引矩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狼讨,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡融虽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舞终。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡癣猾,死狀恐怖敛劝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纷宇,我是刑警寧澤夸盟,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站呐粘,受9級(jí)特大地震影響满俗,放射性物質(zhì)發(fā)生泄漏转捕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一唆垃、第九天 我趴在偏房一處隱蔽的房頂上張望五芝。 院中可真熱鬧,春花似錦辕万、人聲如沸枢步。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽醉途。三九已至,卻和暖如春砖茸,著一層夾襖步出監(jiān)牢的瞬間隘擎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工凉夯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留货葬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓劲够,卻偏偏與公主長(zhǎng)得像震桶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子征绎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蹲姐,服務(wù)發(fā)現(xiàn),斷路器人柿,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 從三月份找實(shí)習(xí)到現(xiàn)在柴墩,面了一些公司,掛了不少顷扩,但最終還是拿到小米拐邪、百度、阿里隘截、京東扎阶、新浪、CVTE婶芭、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,239評(píng)論 11 349
  • 全文鏈接 第一章 創(chuàng)建一個(gè)blog應(yīng)用第二章 使用高級(jí)特性來增強(qiáng)你的blog第三章 擴(kuò)展你的blog應(yīng)用第四章上 ...
    夜夜月閱讀 10,004評(píng)論 27 36
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法犀农,類相關(guān)的語法惰赋,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法赁濒,線程的語...
    子非魚_t_閱讀 31,622評(píng)論 18 399
  • jquery源碼分析
    尾巴尾巴尾巴閱讀 333評(píng)論 0 0