SQLAlchemy學習筆記(一)

前言:該筆記是本人學習SQLAlchemy官方文檔整理得來郑兴。

查看SQLAlchemy版本

>>> import sqlalchemy
>>> sqlalchemy.__version__
'1.0.15'
>>>

連接數(shù)據(jù)庫

本教程中我們將使用postgresql數(shù)據(jù)庫精绎,連接數(shù)據(jù)庫我們使用create_engine():

>>> >>> from sqlalchemy import create_engine
>>> engine = create_engine('postgresql://ricky:passwd@localhost/my_db', echo=True)

關于SQLAlchemy連接不同的數(shù)據(jù)庫的URL設置衰齐,請自行搜索娘香。
echo參數(shù)是設置SQLAlchemy日志顯示的快捷方式锉屈,這樣我們在python命令行中執(zhí)行的命令都會在下面顯示出日志信息(這里我們能清楚看到只想的SQL語句詳細內容)荤傲。如果我們不想看見執(zhí)行的詳細過程,可以將echo設置為False颈渊。

create_engine()函數(shù)返回一個Engin的實例遂黍,代表著訪問數(shù)據(jù)庫的接口。

延遲連接

create_engine()第一次調用俊嗽,它沒有嘗試去連接數(shù)據(jù)庫雾家,僅僅是當我們執(zhí)行數(shù)據(jù)庫操作時,才會去連接數(shù)據(jù)庫绍豁。

定義映射

當我們在使用ORM的時候芯咧,數(shù)據(jù)庫中的一張表對應著我們的一個類,我們使用declarative_base()創(chuàng)建一個基類竹揍。

>>> from sqlalchemy.ext.declarative import declarative_base
>>> Base = declarative_base()

現(xiàn)在我們有了一個基類Base,我們可以定義很多映射的類,先從一張完整的表格,名字為Users開始,一個新的User類將會映射到我們的那種表格上敬飒,在類中我們定義關于表格的詳細信息。主要是表名鬼佣、列名和數(shù)據(jù)類型驶拱。

>>> from sqlalchemy import Column, Integer, String
>>> class User(Base):
...     __tablename__ = 'users'
...
...     id = Column(Integer, primary_key=True)
...     name = Column(String)
...     fullname = Column(String)
...     password = Column(String)
...
...     def __repr__(self):
...             return "<User(naem=%s, fullname=%s, password=%s)>" % (self.name, self.fullname, self.password)
...

一個最簡單的類需要一個__tablename__屬性,和至少一行Column和一個外鍵primary key晶衷。

Tip######

User類定義了一個__repr__()方法蓝纲,但是這個是可選的阴孟,我們在這里定義是為了打印出類的對象的內容。

創(chuàng)建一個模型

通過聲明系統(tǒng)税迷,我們已經(jīng)定義了我們表格的詳細信息永丝,我們可以通過__table__屬性來看我們定義的類

>>> User.__table__
Table('users', MetaData(bind=None), 
Column('id', Integer(), table=<users>, primary_key=True, nullable=False), 
Column('name', String(), table=<users>), 
Column('fullname', String(), table=<users>), 
Column('password', String(), table=<users>), schema=None)

當我們定義了我們的類,聲明系統(tǒng)使用一個Python的metaclass來執(zhí)行其他任務箭养,一旦這個類聲明完成慕嚷。
表的對象是一個更大的稱為元數(shù)據(jù)集合的一個成員。當我們使用這個系統(tǒng)毕泌,可以使用這個對象.metadata屬性聲明我們基類的屬性喝检。

MetaData是一個注冊表,當我們的數(shù)據(jù)庫不存在一個users表格撼泛,我們可以使用MetaData去創(chuàng)建一個不存在的表格挠说,我們調用MetaData.create_all()方法,Engine作為一個數(shù)據(jù)庫的連接愿题。

>>> Base.metadata.create_all(engine)
SELECT ...
PRAGMA table_info("users")
()
CREATE TABLE users (
    id INTEGER NOT NULL, name VARCHAR,
    fullname VARCHAR,
    password VARCHAR,
    PRIMARY KEY (id)
)
()
COMMIT
Minimal Table Descriptions vs. Full Descriptions

在上面的聲明一個表中的列時损俭,我們注意到列的數(shù)據(jù)類型為字符串,但是沒有指定長度潘酗;在SQLite和PostgreSQL中這樣的聲明是合法的杆兵,但是在其他的數(shù)據(jù)庫中是不允許的。所以仔夺,如果運行這個教程在洽談的數(shù)據(jù)庫中琐脏,可能會報錯。最好我很使用下面的聲明方式缸兔。

Column(String(50))

另外在Firebird和Oracle數(shù)據(jù)庫中要求sequences去生成一個新的外鍵約束骆膝。你可以使用序列來構造。

from sqlalchemy import Sequence
Column(Integer, Sequence('user_id_seq'), primary_key=True)

完整的Table的定義為:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    name = Column(String(50))
    fullname = Column(String(50))
    password = Column(String(12))

    def __repr__(self):
        return "<User(name='%s', fullname='%s', password='%s')>" % (
                                self.name, self.fullname, self.password)

創(chuàng)建一個映射的類的對象

我們來創(chuàng)建一個User的對象.

>>> ed_user = User(name='ricky', fullname='yuziyong', password='123')
>>> ed_user.name
'ricky'
>>> ed_user.password
'123'
>>> ed_user.fullname
'yuziyong'
>>> str(ed_user.id)
'None'

盡管我們沒有特別在構造函數(shù)指定灶体,但是id屬性仍然產(chǎn)生了一個值None,當我們訪問它阅签,SQLAlchemy的工具通常會產(chǎn)生一個默認值。

待續(xù)蝎抽。政钟。。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末樟结,一起剝皮案震驚了整個濱河市养交,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓢宦,老刑警劉巖碎连,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異驮履,居然都是意外死亡鱼辙,警方通過查閱死者的電腦和手機廉嚼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倒戏,“玉大人怠噪,你說我怎么就攤上這事《捧危” “怎么了傍念?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長葛闷。 經(jīng)常有香客問我憋槐,道長,這世上最難降的妖魔是什么淑趾? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任秦陋,我火速辦了婚禮,結果婚禮上治笨,老公的妹妹穿的比我還像新娘。我一直安慰自己赤嚼,他們只是感情好旷赖,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著更卒,像睡著了一般等孵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹂空,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天俯萌,我揣著相機與錄音,去河邊找鬼上枕。 笑死咐熙,一個胖子當著我的面吹牛,可吹牛的內容都是我干的辨萍。 我是一名探鬼主播棋恼,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锈玉!你這毒婦竟也來了爪飘?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤拉背,失蹤者是張志新(化名)和其女友劉穎师崎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椅棺,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡犁罩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年齐蔽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昼汗。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡肴熏,死狀恐怖,靈堂內的尸體忽然破棺而出顷窒,到底是詐尸還是另有隱情蛙吏,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布鞋吉,位于F島的核電站鸦做,受9級特大地震影響,放射性物質發(fā)生泄漏谓着。R本人自食惡果不足惜泼诱,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赊锚。 院中可真熱鬧治筒,春花似錦、人聲如沸舷蒲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牲平。三九已至堤框,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纵柿,已是汗流浹背蜈抓。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昂儒,地道東北人沟使。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像渊跋,于是被迫代替她去往敵國和親格带。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內容