国产chinesehdxxxx野外,国产av无码专区亚洲av琪琪,播放男人添女人下边视频,成人国产精品一区二区免费看,chinese丰满人妻videos

6.8 與關(guān)系型數(shù)據(jù)庫的交互

2018-02-24 15:26 更新

問題

你想在關(guān)系型數(shù)據(jù)庫中查詢、增加或刪除記錄。

解決方案

Python中表示多行數(shù)據(jù)的標(biāo)準(zhǔn)方式是一個由元組構(gòu)成的序列。例如:

stocks = [
    ('GOOG', 100, 490.1),
    ('AAPL', 50, 545.75),
    ('FB', 150, 7.45),
    ('HPQ', 75, 33.2),
]

依據(jù)PEP249,通過這種形式提供數(shù)據(jù),可以很容易的使用Python標(biāo)準(zhǔn)數(shù)據(jù)庫API和關(guān)系型數(shù)據(jù)庫進(jìn)行交互。所有數(shù)據(jù)庫上的操作都通過SQL查詢語句來完成。每一行輸入輸出數(shù)據(jù)用一個元組來表示。

為了演示說明,你可以使用Python標(biāo)準(zhǔn)庫中的 sqlite3 模塊。如果你使用的是一個不同的數(shù)據(jù)庫(比如MySql、Postgresql或者ODBC),還得安裝相應(yīng)的第三方模塊來提供支持。不過相應(yīng)的編程接口幾乎都是一樣的,除了一點點細(xì)微差別外。

第一步是連接到數(shù)據(jù)庫。通常你要執(zhí)行 connect() 函數(shù),給它提供一些數(shù)據(jù)庫名、主機、用戶名、密碼和其他必要的一些參數(shù)。例如:

>>> import sqlite3
>>> db = sqlite3.connect('database.db')
>>>

為了處理數(shù)據(jù),下一步你需要創(chuàng)建一個游標(biāo)。一旦你有了游標(biāo),那么你就可以執(zhí)行SQL查詢語句了。比如:

>>> c = db.cursor()
>>> c.execute('create table portfolio (symbol text, shares integer, price real)')
<sqlite3.Cursor object at 0x10067a730>
>>> db.commit()
>>>

為了向數(shù)據(jù)庫表中插入多條記錄,使用類似下面這樣的語句:

>>> c.executemany('insert into portfolio values (?,?,?)', stocks)
<sqlite3.Cursor object at 0x10067a730>
>>> db.commit()
>>>

為了執(zhí)行某個查詢,使用像下面這樣的語句:

>>> for row in db.execute('select * from portfolio'):
...     print(row)
...
('GOOG', 100, 490.1)
('AAPL', 50, 545.75)
('FB', 150, 7.45)
('HPQ', 75, 33.2)
>>>

如果你想接受用戶輸入作為參數(shù)來執(zhí)行查詢操作,必須確保你使用下面這樣的占位符?來進(jìn)行引用參數(shù):

>>> min_price = 100
>>> for row in db.execute('select * from portfolio where price >= ?',
                          (min_price,)):
...     print(row)
...
('GOOG', 100, 490.1)
('AAPL', 50, 545.75)
>>>

討論

在比較低的級別上和數(shù)據(jù)庫交互是非常簡單的。你只需提供SQL語句并調(diào)用相應(yīng)的模塊就可以更新或提取數(shù)據(jù)了。雖說如此,還是有一些比較棘手的細(xì)節(jié)問題需要你逐個列出去解決。

一個難點是數(shù)據(jù)庫中的數(shù)據(jù)和Python類型直接的映射。對于日期類型,通??梢允褂?datetime 模塊中的 datetime 實例,或者可能是 time 模塊中的系統(tǒng)時間戳。對于數(shù)字類型,特別是使用到小數(shù)的金融數(shù)據(jù),可以用 decimal 模塊中的 Decimal 實例來表示。不幸的是,對于不同的數(shù)據(jù)庫而言具體映射規(guī)則是不一樣的,你必須參考相應(yīng)的文檔。

另外一個更加復(fù)雜的問題就是SQL語句字符串的構(gòu)造。你千萬不要使用Python字符串格式化操作符(如%)或者 .format() 方法來創(chuàng)建這樣的字符串。如果傳遞給這些格式化操作符的值來自于用戶的輸入,那么你的程序就很有可能遭受SQL注入攻擊(參考 http://xkcd.com/327 )。查詢語句中的通配符?指示后臺數(shù)據(jù)庫使用它自己的字符串替換機制,這樣更加的安全。

不幸的是,不同的數(shù)據(jù)庫后臺對于通配符的使用是不一樣的。大部分模塊使用?或%s,還有其他一些使用了不同的符號,比如:0或:1來指示參數(shù)。同樣的,你還是得去參考你使用的數(shù)據(jù)庫模塊相應(yīng)的文檔。一個數(shù)據(jù)庫模塊的 paramstyle 屬性包含了參數(shù)引用風(fēng)格的信息。

對于簡單的數(shù)據(jù)庫數(shù)據(jù)的讀寫問題,使用數(shù)據(jù)庫API通常非常簡單。如果你要處理更加復(fù)雜的問題,建議你使用更加高級的接口,比如一個對象關(guān)系映射ORM所提供的接口。類似 SQLAlchemy 這樣的庫允許你使用Python類來表示一個數(shù)據(jù)庫表,并且能在隱藏底層SQL的情況下實現(xiàn)各種數(shù)據(jù)庫的操作。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號