W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
你想在關(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ù)庫的操作。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: