下面我将为你提供一个从安装到完整使用示例的详细指南。
第1步:安装 psycopg2 库
你需要安装 psycopg2 库,你可以使用 pip 来安装。
打开你的终端或命令行工具,运行以下命令:
pip install psycopg2-binary
注意:
psycopg2vspsycopg2-binary:psycopg2-binary是一个预编译的版本,非常适合开发和测试,因为它包含了所有需要的依赖,在生产环境中,你可能需要从源代码编译psycopg2以获得更好的性能和灵活性,但对于初学者来说,psycopg2-binary是最简单、最直接的选择。- 如果遇到问题:在某些系统上(特别是 Windows),你可能需要先安装一个 C 编译器和 PostgreSQL 的开发库,如果安装失败,请查阅
psycopg2的官方文档或搜索相关解决方案。
第2步:获取数据库连接信息
在连接数据库之前,你需要从你的 PostgreSQL 服务器管理员或服务提供商那里获取以下信息:
- 主机名:数据库服务器的地址,
localhost(本地)或db.example.com(远程)。 - 端口:PostgreSQL 的默认端口是
5432。 - 数据库名称:你要连接的具体数据库的名称。
- 用户名:用于认证的用户名。
- 密码:该用户的密码。
第3步:编写 Python 代码连接数据库
下面是一个完整的 Python 脚本示例,展示了如何连接到 PostgreSQL 数据库,执行一个简单的查询,并处理结果。
示例代码:connect_postgres.py
import psycopg2
import os
# --- 1. 定义数据库连接信息 ---
# 建议将敏感信息(如密码)存储在环境变量中,而不是硬编码在脚本里
DB_HOST = os.getenv("DB_HOST", "localhost")
DB_PORT = os.getenv("DB_PORT", "5432")
DB_NAME = os.getenv("DB_NAME", "testdb")
DB_USER = os.getenv("DB_USER", "postgres")
DB_PASSWORD = os.getenv("DB_PASSWORD", "your_password")
# --- 2. 建立连接 ---
try:
# 使用 connect() 函数建立连接
# 它会返回一个 connection 对象
conn = psycopg2.connect(
host=DB_HOST,
port=DB_PORT,
dbname=DB_NAME,
user=DB_USER,
password=DB_PASSWORD
)
print("成功连接到 PostgreSQL 数据库!")
# --- 3. 创建一个游标对象 ---
# 游标用于执行 SQL 查询并获取结果
cur = conn.cursor()
# --- 4. 执行 SQL 查询 ---
# 示例:查询 'employees' 表中的前5条记录
# 假设表结构为: id (SERIAL), name (VARCHAR), department (VARCHAR)
cur.execute("SELECT id, name, department FROM employees LIMIT 5;")
# --- 5. 获取查询结果 ---
# fetchone() 获取下一行结果
# fetchmany(size) 获取指定数量的结果
# fetchall() 获取所有剩余结果
print("\n查询结果:")
for row in cur:
# row 是一个元组,(1, 'Alice', 'Engineering')
print(f"ID: {row[0]}, Name: {row[1]}, Department: {row[2]}")
# --- 6. 执行插入操作 (示例) ---
print("\n--- 执行插入操作 ---")
insert_query = "INSERT INTO employees (name, department) VALUES (%s, %s);"
# 注意:使用 %s 作为占位符,这是防止 SQL 注入的安全方式
# 不要使用 f-string 或 % 格式化来直接插入变量值,
# cur.execute(f"INSERT INTO ... VALUES ('{name}', '{department}');") # 危险!
new_employee = ("Bob", "Marketing")
cur.execute(insert_query, new_employee)
# --- 7. 提交事务 ---
# 在 PostgreSQL 中,DML 操作(如 INSERT, UPDATE, DELETE)需要显式提交
conn.commit()
print(f"成功插入新员工: {new_employee[0]}")
# --- 8. 关闭游标和连接 ---
# 好习惯是先关闭游标,再关闭连接
cur.close()
conn.close()
print("\n数据库连接已关闭。")
except psycopg2.Error as e:
# --- 9. 处理异常 ---
print(f"数据库错误: {e}")
# 如果发生错误,回滚事务(撤销未提交的更改)
if 'conn' in locals() and conn is not None:
conn.rollback()
第4步:使用上下文管理器(推荐的最佳实践)
手动管理游标和连接的关闭 (cur.close(), conn.close()) 很容易出错,尤其是在发生异常时。psycopg2 提供了上下文管理器(with 语句)来自动处理这些资源,这是更安全、更推荐的做法。
使用上下文管理器的代码示例:
import psycopg2
import os
# 数据库连接信息(同上)
DB_HOST = "localhost"
DB_NAME = "testdb"
DB_USER = "postgres"
DB_PASSWORD = "your_password"
# 使用 with 语句管理连接
try:
with psycopg2.connect(
host=DB_HOST,
dbname=DB_NAME,
user=DB_USER,
password=DB_PASSWORD
) as conn:
print("成功连接到 PostgreSQL 数据库!")
# 使用 with 语句管理游标
with conn.cursor() as cur:
# 执行查询
cur.execute("SELECT id, name, department FROM employees LIMIT 5;")
print("\n查询结果:")
for row in cur:
print(f"ID: {row[0]}, Name: {row[1]}, Department: {row[2]}")
# 执行插入
insert_query = "INSERT INTO employees (name, department) VALUES (%s, %s);"
new_employee = ("Charlie", "Sales")
cur.execute(insert_query, new_employee)
# 提交事务
conn.commit()
print(f"成功插入新员工: {new_employee[0]}")
# 当 with 块执行完毕后,游标会自动关闭
# 当 with 块执行完毕后,连接会自动关闭
print("\n数据库连接已自动关闭。")
except psycopg2.Error as e:
print(f"数据库错误: {e}")
# conn 对象存在且发生错误,上下文管理器会自动执行回滚
第5步:使用 ORM (对象关系映射) - 更高级的选择
对于大型项目,直接写 SQL 语句可能会变得繁琐且难以维护,这时可以使用 ORM(如 SQLAlchemy)来让你用 Python 类和对象来操作数据库,ORM 会自动将它们转换为 SQL。
使用 SQLAlchemy 的简单示例
首先安装 SQLAlchemy:
pip install SQLAlchemy
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 1. 定义数据库连接 URL
# 格式: postgresql+psycopg2://用户名:密码@主机:端口/数据库名
DATABASE_URL = "postgresql+psycopg2://postgres:your_password@localhost/testdb"
# 2. 创建引擎
engine = create_engine(DATABASE_URL)
# 3. 创建会话工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 4. 声明基类
Base = declarative_base()
# 5. 定义模型 (Python 类映射到数据库表)
class Employee(Base):
__tablename__ = 'employees' # 表名
id = Column(Integer, primary_key=True, index=True)
name = Column(String)
department = Column(String)
# 6. 创建表 (如果不存在)
Base.metadata.create_all(bind=engine)
# 7. 使用会话进行操作
try:
db = SessionLocal()
print("成功通过 SQLAlchemy 连接数据库!")
# 创建新员工
new_employee = Employee(name="David", department="HR")
db.add(new_employee)
db.commit() # 提交事务
print(f"成功通过 ORM 插入新员工: {new_employee.name}")
# 查询员工
employees = db.query(Employee).filter(Employee.department == "HR").all()
print("\nHR 部门的员工:")
for emp in employees:
print(f"- ID: {emp.id}, Name: {emp.name}")
except Exception as e:
print(f"错误: {e}")
db.rollback() # 回滚
finally:
db.close() # 关闭会话
print("\n数据库会话已关闭。")
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
psycopg2 |
- 简单直接 - 性能最好 - 灵活控制 |
- 需要手动管理资源 - 编写 SQL 语句 |
- 简单脚本 - 性能要求高的应用 - 复杂的 SQL 查询 |
| SQLAlchemy (ORM) | - 代码更 Pythonic - 自动管理连接和事务 - 防止 SQL 注入 - 易于维护和测试 |
- 有一定的学习曲线 - 性能开销(通常很小) |
- 中大型项目 - 快速开发应用 - 团队协作 |
对于初学者,强烈建议从 psycopg2 开始,因为它能帮助你直接理解数据库操作,当你对数据库交互有了更深的理解后,再根据项目需求考虑是否使用 SQLAlchemy 等 ORM 工具。
