Psycopg - PostgreSQL database adapter for Python
基本模塊用法
Psycopg 的基本用法共同于所有遵循 DB API 2.0 協(xié)議實(shí)現(xiàn)的數(shù)據(jù)庫適配器
Passing parameters to SQL queries
對(duì)于我來說這是最重要的一部分內(nèi)容
Psycopg 根據(jù) Python 變量的類型將變量轉(zhuǎn)換為 SQL 值丑掺。Python 類型確定了用于將對(duì)象轉(zhuǎn)換為與 Postgresql 相匹配的字符串的函數(shù)。大部分標(biāo)準(zhǔn) Python 類型已經(jīng)適配了正確的 SQL 表達(dá)勿决。
傳遞參數(shù)給 SQL 語句發(fā)生在如 cursor.execute() 這樣的函數(shù)中迟杂,其通過在 SQL 語句中使用 %s 占位符并在函數(shù)的第二個(gè)參數(shù)中傳遞值序列泞边。
命名參數(shù)也是支持的拖陆,在查詢中使用 %(name)s 占位符并在映射中指定值咪辱。使用命名參數(shù)允許以任意的次序指定值妇斤,也允許同一值在查詢的幾個(gè)位置重復(fù)栗涂。
命名參數(shù)其名中不能包含 %, (, ) 三字符碰酝。
在使用參數(shù)的查詢中,為了使用 % 字面量戴差,可以使用 %% 串送爸。
Transactions control 事務(wù)控制
Psycopg 中事務(wù)由 connection 類控制。缺省情況下暖释,當(dāng)首次將一個(gè)命令發(fā)送到數(shù)據(jù)庫時(shí)袭厂,一個(gè)新的事務(wù)被創(chuàng)建。其后的命令將在同一個(gè)事務(wù)環(huán)境中執(zhí)行 - 不僅是第一個(gè) cursor 發(fā)出的命令球匕,而且是由同一個(gè)連接創(chuàng)建的所有 cursor 都如此纹磺。可能任一命令失敗亮曹,事務(wù)即中斷橄杨,后續(xù)命令停止運(yùn)行秘症,直到 rollback() 方法被調(diào)用。
connection 負(fù)責(zé)了結(jié)其事務(wù)式矫,通過調(diào)用 commit() 或 rollback() 方法乡摹。變更即刻持久化于庫中。關(guān)閉連接使用 closer() 方法或刪除連接對(duì)象采转,(使用 del 或 使其 fall out of scope )將導(dǎo)致隱式 rollback 聪廉。
connection 可被設(shè)置為 autocommit 模式:這樣所有執(zhí)行的命令將立即確認(rèn),不能回滾故慈。有幾個(gè)命令板熊,如 CREATE DATABASE, VACUUM 等需要運(yùn)行在事務(wù)之外。為了能夠從 Psycopg 運(yùn)行這些命令察绷,connection 必須在 autocommit 態(tài)干签。可以使用 autocommit 屬性拆撼。
告誡:缺省情況下容劳,即使一個(gè)簡(jiǎn)單的 SELECT 也會(huì)啟動(dòng)一個(gè)事務(wù)。在長(zhǎng)時(shí)間運(yùn)行的程序中情萤,如果沒有進(jìn)一步的動(dòng)作,會(huì)話將被保持摹恨,即“在連接中發(fā)呆”筋岛,因?yàn)閹讉€(gè)原因這種狀態(tài)是不受待見的(會(huì)話保持鎖,表爆炸)晒哄。對(duì)于長(zhǎng)期存在的腳本睁宰,請(qǐng)確保盡快終止事務(wù)或使用自動(dòng)提交連接。
還有幾個(gè)事務(wù)屬性能夠設(shè)置會(huì)話范圍寝凌。詳見 set_seesion()
SQL string composition
模塊包含著以一種安全便捷的方式動(dòng)態(tài)生成 SQL 的對(duì)象和方法柒傻。SQL 標(biāo)識(shí)符,如:表名较木,字段名 不能像查詢參數(shù)那樣傳遞給 execute() 方法红符。SQL 查詢應(yīng)在參數(shù)合并之前構(gòu)成。
class psycopg2.sql.Composable(wrapped)
可被用于組成 SQL 字符串的對(duì)象的抽象基類伐债。
Composable 對(duì)象可被直接傳入 execute(), executemany(), copy_expert() 预侯,占用查詢串的位置。
Composable 對(duì)象可以使用操作符 + 連接:結(jié)果為包含連接對(duì)象的 Composed 實(shí)例峰锁。Composable 對(duì)象也支持操作符 * : 結(jié)果為包含重復(fù)請(qǐng)求次數(shù)左參的 Composed 實(shí)例萎馅。
```
query = sql.SQL("select {0} from {1}").format(
sql.SQL(', ').join([sql.Identifier('foo'), sql.Identifier('bar']),
sql.Identifier('table'))
# select "foo", "bar" from "table"
```
class psycopg2.sql.SQL(string)
Composable 表示一段 SQL 語句。
SQL 暴露了 join() 與 format() 方法幫助合并查詢的變量部分虹蒋,創(chuàng)建模板糜芳。
參數(shù) string 不接受任何形式的逃逸飒货,所以 SQL 不適合表示變量、標(biāo)識(shí)符或值:應(yīng)該僅被用于傳遞常量字符串表示模板或 SQL 語句段峭竣,使用其它對(duì)象如 Identifier 或 Literal 表示變量部分塘辅。
class psycopg2.sql.Placeholder(name=None)
將一個(gè) Composable 對(duì)象表示為查詢參數(shù)占位符。
如果指定 name 則生成命名占位符邪驮,否則生成位置占位符莫辨。
對(duì)象用于生成帶有數(shù)個(gè)參數(shù)變量的 SQL 查詢。
例子:
names = ['foo', 'bar', 'baz']
q1 = sql.SQL("insert into table ( {} ) values ({}) ")
.format(
sql.SQL('.').join( map( sql.Identifier, names ) ),
sql.SQL('.').join( sql.Placeholder() * len( names ) )
)
# insert into table ("foo", "bar", "baz") values (%s, %s, %s)
q2 = sql.SQL("insert into table ( {} ) values ({}) ")
.format(
sql.SQL('.').join( map( sql.Identifier, names ) ),
sql.SQL('.').join( map( sql.Placeholder, names ) )
)
# insert into table ("foo", "bar", "baz") values (%(foo)s, %(bar)s, %(baz)s)
name
The name of the Placeholder.