Redrock Postgres 文档
主页 切换暗/亮/自动模式 切换暗/亮/自动模式 切换暗/亮/自动模式 返回首页

基本模块用法

基本的 Psycopg 用法,跟所有实现 DB-API 协议的数据库适配器一样,是通用的。其他数据库适配器(如内置的 sqlite3psycopg2)具有大致相同的交互模式。

Psycopg 3 中的主要对象

下面是一个交互式会话,显示了一些基本命令:

# Note: the module name is psycopg, not psycopg3
import psycopg

# Connect to an existing database
with psycopg.connect("dbname=test user=postgres") as conn:

    # Open a cursor to perform database operations
    with conn.cursor() as cur:

        # Execute a command: this creates a new table
        cur.execute("""
            CREATE TABLE test (
                id serial PRIMARY KEY,
                num integer,
                data text)
            """)

        # Pass data to fill a query placeholders and let Psycopg perform
        # the correct conversion (no SQL injections!)
        cur.execute(
            "INSERT INTO test (num, data) VALUES (%s, %s)",
            (100, "abc'def"))

        # Query the database and obtain data as Python objects.
        cur.execute("SELECT * FROM test")
        cur.fetchone()
        # will return (1, 100, "abc'def")

        # You can use `cur.fetchmany()`, `cur.fetchall()` to return a list
        # of several records, or even iterate on the cursor
        for record in cur:
            print(record)

        # Make the changes to the database persistent
        conn.commit()

在示例中,您可以看到一些主要对象和方法以及它们之间的关系:

您必须处理的一些重要主题是:

快捷方式

上面的模式对psycopg2的用户来说很熟悉。但是,Psycopg 3 也提供了一些简单的扩展,使上述模式更加精简:

  • Connection对象提供了一个execute()方法,等效于创建游标、调用其execute()方法并返回它。

    # In Psycopg 2
    cur = conn.cursor()
    cur.execute(...)
    
    # In Psycopg 3
    cur = conn.execute(...)
    
  • Cursor.execute() 方法返回self。这意味着您可以将获取操作(例如 fetchone())链接到execute()调用:

    # In Psycopg 2
    cur.execute(...)
    record = cur.fetchone()
    
    cur.execute(...)
    for record in cur:
        ...
    
    # In Psycopg 3
    record = cur.execute(...).fetchone()
    
    for record in cur.execute(...):
        ...
    

在简单的情况下,将它们一起使用,可以在单个表达式中从创建连接到使用结果:

print(psycopg.connect(DSN).execute("SELECT now()").fetchone()[0])
# 2042-07-12 18:15:10.706497+01:00

连接上下文

Psycopg 3 Connection 可以用作上下文管理器:

with psycopg.connect() as conn:
    ... # use the connection

# the connection is now closed

当退出代码块时,如果连接有事务打开,它将被提交。如果在代码块内引发异常,则事务将回滚。在这两种情况下,连接都会被关闭。它大致相当于:

conn = psycopg.connect()
try:
    ... # use the connection
except BaseException:
    conn.rollback()
else:
    conn.commit()
finally:
    conn.close()
这种行为和psycopg2存在差异:在psycopg2中,连接没有结束时的 close(),并且可以在多个with语句中使用连接来管理不同的事务。这种行为被认为是非标准的和令人惊讶的,所以它已经被更明确的 transaction() 块所取代。

请注意,虽然上面的模式是大多数人会使用的,但 connect() 本身不会引入代码块,而是返回一个普通的连接,因此无论代码范围如何,仍然可以使用连接,并且开发人员可以根据需要自由使用(并负责调用)commit()rollback()close()

如果一个连接离开了代码块范围,那么使用和不使用with块,它的行为方式是不同的:

  • 如果在没有with块的情况下使用连接,服务端会发现一个在事务中的连接需要关闭并回滚当前事务;
  • 如果连接与with块一起使用,则会有一个显式 COMMIT 以完成操作。

当您的意图只是执行一组操作然后提交结果时,您应该使用with块,这是使用连接最常见的事情。如果您的连接生命周期和事务模式不一样,并且想要对其进行更多控制,则不使用with可能会更方便。

请参阅事务管理,查看更多相关信息。

AsyncConnection 也可以使用async with的形式来用作上下文管理器,但要注意它的古怪之处:有关详细信息,请参阅使用异步连接

使 pyscopg 适应您的程序

上述使用模式仅展示了适配器的默认行为。Psycopg 可以通过多种方式进行自定义,以便在您的 Python 程序和 PostgreSQL 数据库之间实现最顺畅的集成:

  • 如果您的程序是基于 asyncio 而不是线程/进程实现的并发能力,则可以使用异步连接和游标
  • 如果要自定义游标返回的对象,而不是接收元组,则可以指定行工厂
  • 如果要自定义 Python 值和 PostgreSQL 类型相互映射的方式,除了基本类型映射之外,您还可以配置类型