Psycopg 2.7 无责任翻译

Psycopg - PostgreSQL database adapter for Python

基本模块用法

Psycopg 的基本用法共同于所有遵循 DB API 2.0 协议实现的数据库适配器

Passing parameters to SQL queries

对于我来说这是最重要的一部分内容

Psycopg 根据 Python 变量的类型将变量转换为 SQL 值。Python 类型确定了用于将对象转换为与 Postgresql 相匹配的字符串的函数。大部分标准 Python 类型已经适配了正确的 SQL 表达。

传递参数给 SQL 语句发生在如 cursor.execute() 这样的函数中,其通过在 SQL 语句中使用 %s 占位符并在函数的第二个参数中传递值序列。

命名参数也是支持的,在查询中使用 %(name)s 占位符并在映射中指定值。使用命名参数允许以任意的次序指定值,也允许同一值在查询的几个位置重复。

命名参数其名中不能包含 %, (, ) 三字符。

在使用参数的查询中,为了使用 % 字面量,可以使用 %% 串。

Transactions control 事务控制

Psycopg 中事务由 connection 类控制。缺省情况下,当首次将一个命令发送到数据库时,一个新的事务被创建。其后的命令将在同一个事务环境中执行 - 不仅是第一个 cursor 发出的命令,而且是由同一个连接创建的所有 cursor 都如此。可能任一命令失败,事务即中断,后续命令停止运行,直到 rollback() 方法被调用。

connection 负责了结其事务,通过调用 commit() 或 rollback() 方法。变更即刻持久化于库中。关闭连接使用 closer() 方法或删除连接对象,(使用 del 或 使其 fall out of scope )将导致隐式 rollback 。

connection 可被设置为 autocommit 模式:这样所有执行的命令将立即确认,不能回滚。有几个命令,如 CREATE DATABASE, VACUUM 等需要运行在事务之外。为了能够从 Psycopg 运行这些命令,connection 必须在 autocommit 态。可以使用 autocommit 属性。

告诫:缺省情况下,即使一个简单的 SELECT 也会启动一个事务。在长时间运行的程序中,如果没有进一步的动作,会话将被保持,即“在连接中发呆”,因为几个原因这种状态是不受待见的(会话保持锁,表爆炸)。对于长期存在的脚本,请确保尽快终止事务或使用自动提交连接。

还有几个事务属性能够设置会话范围。详见 set_seesion()

SQL string composition

模块包含着以一种安全便捷的方式动态生成 SQL 的对象和方法。SQL 标识符,如:表名,字段名 不能像查询参数那样传递给 execute() 方法。SQL 查询应在参数合并之前构成。

class psycopg2.sql.Composable(wrapped)
可被用于组成 SQL 字符串的对象的抽象基类。

Composable 对象可被直接传入 execute(), executemany(), copy_expert() ,占用查询串的位置。

Composable 对象可以使用操作符 + 连接:结果为包含连接对象的 Composed 实例。Composable 对象也支持操作符 * : 结果为包含重复请求次数左参的 Composed 实例。

```
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() 方法帮助合并查询的变量部分,创建模板。

参数 string 不接受任何形式的逃逸,所以 SQL 不适合表示变量、标识符或值:应该仅被用于传递常量字符串表示模板或 SQL 语句段,使用其它对象如 Identifier 或 Literal 表示变量部分。
class psycopg2.sql.Placeholder(name=None)

将一个 Composable 对象表示为查询参数占位符。

如果指定 name 则生成命名占位符,否则生成位置占位符。

对象用于生成带有数个参数变量的 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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,422评论 0 4
  • 转载,觉得这篇写 SQLAlchemy Core,写得非常不错。不过后续他没写SQLAlchemy ORM... ...
    非梦nj阅读 5,368评论 1 14
  • 胡自强 爱自己是学习心理学走上心灵成长道路的第一个阶段。 很多朋友参加各种课程和体验, 老师主要讲的也是爱自己的内...
    想文艺文艺不起来的青年阅读 310评论 0 0
  • 文 | 飘扬的鹅毛 手术室里。 滋啦、滋啦的声音飘荡在空气里。 半分钟前麻醉师在我背后的大椎上不声不响地打了一针,...
    飘扬的鹅毛阅读 570评论 13 13
  • 文:山山 从医科大第一附属医院出来,我准备去铁路局汇嘉时代,发现公交车站人山人海,想想真是严寒也阻挡不了人们对健康...
    11山山阅读 1,606评论 38 68