基本模块用法
基本的 Psycopg 用法,跟所有实现 DB-API 协议的数据库适配器一样,是通用的。其他数据库适配器(如内置的 sqlite3
或 psycopg2
)具有大致相同的交互模式。
下面是一个交互式会话,显示了一些基本命令:
# 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()
在示例中,您可以看到一些主要对象和方法以及它们之间的关系:
- 函数
connect()
创建一个新的数据库会话并返回一个新的Connection
实例。AsyncConnection.connect()
会创建一个asyncio
连接。 Connection
类封装的是一个数据库会话。它允许:- 使用
cursor()
方法创建新的Cursor
实例来执行数据库命令和查询, - 使用
commit()
或rollback()
方法终止事务。
- 使用
- 类
Cursor
允许与数据库交互:- 使用
execute()
、executemany()
等方法将命令发送到数据库, - 使用游标遍历或使用
fetchone()
、fetchmany()
、fetchall()
等方法,从数据库中检索数据。
- 使用
- 使用这些对象作为上下文管理器(即使用
with
)将确保在代码块结束时关闭它们并释放它们的资源(请注意,这与 psycopg2 不同)。
您必须处理的一些重要主题是:
上面的模式对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
的形式来用作上下文管理器,但要注意它的古怪之处:有关详细信息,请参阅使用异步连接。
上述使用模式仅展示了适配器的默认行为。Psycopg 可以通过多种方式进行自定义,以便在您的 Python 程序和 PostgreSQL 数据库之间实现最顺畅的集成: