用户国营 发表于 2025-1-8 12:14:21

Python 连接和操纵 PostgreSQL 数据库的详解

引言

在当今信息化的期间,数据库已成为存储和管理数据的关键技术。PostgreSQL 是一种开源的对象关系型数据库管理体系(ORDBMS),以其强盛的功能和稳固性而广受欢迎。Python 作为一种高级编程语言,因其简洁易读的语法和丰富的库支持,成为了数据处理和数据库操纵的理想选择。本文将具体先容如何使用 Python 连接和操纵 PostgreSQL 数据库,包括环境搭建、连接数据库、执行 SQL 查询和更新操纵,以及处理非常和事务管理等内容。
https://i-blog.csdnimg.cn/direct/f0b90d660f36430ba8e14f93a0708329.png#pic_center
环境搭建

在开始之前,我们需要确保体系上已经安装了 PostgreSQL 数据库和 Python 环境。以下是安装步骤:
安装 PostgreSQL

在 Windows 上安装 PostgreSQL


[*]访问 PostgreSQL 官方网站下载实用于 Windows 的安装程序。
[*]运行安装程序并按照提示完成安装。
[*]安装完成后,启动 PostgreSQL 服务并记下端标语(默以为 5432)。
在 Linux 上安装 PostgreSQL

sudo apt-get update
sudo apt-get install postgresql postgresql-contrib
在 macOS 上安装 PostgreSQL

brew install postgresql
安装 Python 和相关库

确保体系上已经安装了 Python。然后使用 pip 安装 psycopg2 库,这是一个用于连接 PostgreSQL 数据库的 Python 扩展模块。
pip install psycopg2
连接数据库

连接数据库是举行数据库操纵的第一步。以下是使用 Python 连接 PostgreSQL 数据库的根本步骤:
导入库

import psycopg2
建立连接

try:
    conn = psycopg2.connect(
      host="localhost",
      database="mydatabase",
      user="myuser",
      password="mypassword"
    )
    print("成功连接到数据库")
except psycopg2.Error as e:
    print(f"连接数据库失败: {e}")
创建游标

游标用于执行 SQL 查询并获取结果。
cur = conn.cursor()
执行查询

try:
    cur.execute("SELECT version();")
    db_version = cur.fetchone()
    print(f"数据库版本: {db_version}")
except psycopg2.Error as e:
    print(f"执行查询失败: {e}")
关闭游标和连接

cur.close()
conn.close()
执行 SQL 查询和更新操纵

查询数据

查询数据是最常见的数据库操纵之一。以下是一个简朴的查询示例:
try:
    cur.execute("SELECT * FROM mytable;")
    rows = cur.fetchall()
    for row in rows:
      print(row)
except psycopg2.Error as e:
    print(f"查询失败: {e}")
插入数据

插入数据用于向数据库表中添加新记录。
try:
    cur.execute("INSERT INTO mytable (column1, column2) VALUES (%s, %s);", ("value1", "value2"))
    conn.commit()
    print("插入成功")
except psycopg2.Error as e:
    print(f"插入失败: {e}")
    conn.rollback()
更新数据

更新数据用于修改数据库表中的现有记录。
try:
    cur.execute("UPDATE mytable SET column1 = %s WHERE column2 = %s;", ("new_value1", "value2"))
    conn.commit()
    print("更新成功")
except psycopg2.Error as e:
    print(f"更新失败: {e}")
    conn.rollback()
删除数据

删除数据用于从数据库表中移除记录。
try:
    cur.execute("DELETE FROM mytable WHERE column1 = %s;", ("value1",))
    conn.commit()
    print("删除成功")
except psycopg2.Error as e:
    print(f"删除失败: {e}")
    conn.rollback()
处理非常

在数据库操纵过程中,可能会遇到各种非常情况。为了确保程序的健壮性,我们需要捕捉并处理这些非常。
捕捉非常

try:
    # 数据库操作代码
except psycopg2.Error as e:
    print(f"数据库操作失败: {e}")
finally:
    if conn is not None:
      conn.close()
处理特定非常

偶尔我们需要处理特定类型的非常,例如连接非常或查询非常。
try:
    # 数据库操作代码
except psycopg2.OperationalError as e:
    print(f"连接或操作错误: {e}")
except psycopg2.ProgrammingError as e:
    print(f"SQL 语句错误: {e}")
事务管理

事务是一组数据库操纵,这些操纵要么全部成功,要么全部失败。事务管理对于确保数据的一致性和完备性至关重要。
开启事务

conn.autocommit = False
提交事务

try:
    # 数据库操作代码
    conn.commit()
    print("事务提交成功")
except psycopg2.Error as e:
    conn.rollback()
    print(f"事务提交失败: {e}")
回滚事务

try:
    # 数据库操作代码
    conn.commit()
except psycopg2.Error as e:
    conn.rollback()
    print(f"事务回滚: {e}")
使用上下文管理器

Python 的上下文管理器可以简化资源管理,特别是在处理数据库连接和游标时。
使用 with 语句管理连接

try:
    with psycopg2.connect(
      host="localhost",
      database="mydatabase",
      user="myuser",
      password="mypassword"
    ) as conn:
      with conn.cursor() as cur:
            cur.execute("SELECT version();")
            db_version = cur.fetchone()
            print(f"数据库版本: {db_version}")
except psycopg2.Error as e:
    print(f"连接或查询失败: {e}")
使用 with 语句管理事务

try:    with psycopg2.connect(      host="localhost",      database="mydatabase",      user="myuser",      password="mypassword"    ) as conn:      conn.autocommit = False
      with conn.cursor() as cur:            cur.execute("INSERT INTO mytable (column1, column2) VALUES (%s, %s);", ("value1", "value2"))            conn.commit()            print("插入成功")except psycopg2.Error as e:    print(f"插入失败: {e}") 高级功能

使用参数化查询

参数化查询可以有效防止 SQL 注入攻击,并提高查询性能。
try:
    with psycopg2.connect(
      host="localhost",
      database="mydatabase",
      user="myuser",
      password="mypassword"
    ) as conn:
      with conn.cursor() as cur:
            cur.execute("SELECT * FROM mytable WHERE column1 = %s;", ("value1",))
            rows = cur.fetchall()
            for row in rows:
                print(row)
except psycopg2.Error as e:
    print(f"查询失败: {e}")
使用批量操纵

批量操纵可以显著提高数据插入和更新的性能。
try:
    with psycopg2.connect(
      host="localhost",
      database="mydatabase",
      user="myuser",
      password="mypassword"
    ) as conn:
      with conn.cursor() as cur:
            data = [("value1", "value2"), ("value3", "value4")]
            cur.executemany("INSERT INTO mytable (column1, column2) VALUES (%s, %s);", data)
            conn.commit()
            print("批量插入成功")
except psycopg2.Error as e:
    print(f"批量插入失败: {e}")
使用存储过程

存储过程是预编译的 SQL 代码块,可以在数据库中存储并重复调用。
CREATE OR REPLACE FUNCTION get_user_by_id(user_id INT) RETURNS TABLE(id INT, name TEXT) AS $$
BEGIN
    RETURN QUERY SELECT id, name FROM users WHERE id = user_id;
END;
$$ LANGUAGE plpgsql;


try:
    with psycopg2.connect(
      host="localhost",
      database="mydatabase",
      user="myuser",
      password="mypassword"
    ) as conn:
      with conn.cursor() as cur:
            cur.callproc('get_user_by_id', )
            rows = cur.fetchall()
            for row in rows:
                print(row)
except psycopg2.Error as e:
    print(f"调用存储过程失败: {e}")
性能优化

使用连接池

连接池可以淘汰连接数据库的开销,提高性能。
from psycopg2 import pool

try:
    postgreSQL_pool = psycopg2.pool.SimpleConnectionPool(
      1, 20,
      host="localhost",
      database="mydatabase",
      user="myuser",
      password="mypassword"
    )
    if postgreSQL_pool:
      print("连接池创建成功")
except psycopg2.Error as e:
    print(f"连接池创建失败: {e}")

# 获取连接
conn = postgreSQL_pool.getconn()

try:
    with conn.cursor() as cur:
      cur.execute("SELECT version();")
      db_version = cur.fetchone()
      print(f"数据库版本: {db_version}")
finally:
    # 释放连接
    postgreSQL_pool.putconn(conn)
使用索引

索引可以显著提高查询性能,特别是在大数据集上。
CREATE INDEX idx_column1 ON mytable(column1);
使用批量提交

批量提交可以淘汰事务的开销,提高性能。
try:    with psycopg2.connect(      host="localhost",      database="mydatabase",      user="myuser",      password="mypassword"    ) as conn:      conn.autocommit = False
      with conn.cursor() as cur:            data = [("value1", "value2"), ("value3", "value4")]            for row in data:                cur.execute("INSERT INTO mytable (column1, column2) VALUES (%s, %s);", row)                if len(data) % 1000 == 0:                  conn.commit()                  print("批量提交成功")            conn.commit()            print("插入完成")except psycopg2.Error as e:    print(f"插入失败: {e}")    conn.rollback() 案例分析

为了更好地理解如何使用 Python 连接和操纵 PostgreSQL 数据库,我们将通过一个实际案例来举行演示。
案例背景

假设我们有一个简朴的电子商务网站,需要管理用户信息和订单信息。我们将创建两个表:users 和 orders,并演示如何举行根本的增删改查操纵。
创建表

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT UNIQUE NOT NULL
);

CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    user_id INT NOT NULL,
    amount DECIMAL(10, 2) NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
);
插入数据

try:
    with psycopg2.connect(
      host="localhost",
      database="mydatabase",
      user="myuser",
      password="mypassword"
    ) as conn:
      with conn.cursor() as cur:
            users_data = [
                ("Alice", "alice@example.com"),
                ("Bob", "bob@example.com")
            ]
            cur.executemany("INSERT INTO users (name, email) VALUES (%s, %s);", users_data)
            conn.commit()
            print("用户数据插入成功")

            orders_data = [
                (1, 100.00),
                (2, 200.00)
            ]
            cur.executemany("INSERT INTO orders (user_id, amount) VALUES (%s, %s);", orders_data)
            conn.commit()
            print("订单数据插入成功")
except psycopg2.Error as e:
    print(f"数据插入失败: {e}")
查询数据

try:
    with psycopg2.connect(
      host="localhost",
      database="mydatabase",
      user="myuser",
      password="mypassword"
    ) as conn:
      with conn.cursor() as cur:
            cur.execute("SELECT * FROM users;")
            users = cur.fetchall()
            print("用户数据:")
            for user in users:
                print(user)

            cur.execute("SELECT * FROM orders;")
            orders = cur.fetchall()
            print("订单数据:")
            for order in orders:
                print(order)
except psycopg2.Error as e:
    print(f"数据查询失败: {e}")
更新数据

try:
    with psycopg2.connect(
      host="localhost",
      database="mydatabase",
      user="myuser",
      password="mypassword"
    ) as conn:
      with conn.cursor() as cur:
            cur.execute("UPDATE users SET email = %s WHERE name = %s;", ("alice_new@example.com", "Alice"))
            conn.commit()
            print("用户数据更新成功")
except psycopg2.Error as e:
    print(f"数据更新失败: {e}")
删除数据

try:
    with psycopg2.connect(
      host="localhost",
      database="mydatabase",
      user="myuser",
      password="mypassword"
    ) as conn:
      with conn.cursor() as cur:
            cur.execute("DELETE FROM orders WHERE user_id = %s;", (1,))
            conn.commit()
            print("订单数据删除成功")
except psycopg2.Error as e:
    print(f"数据删除失败: {e}")
结论

通过本文的具体先容,我们学习了如何使用 Python 连接和操纵 PostgreSQL 数据库。从环境搭建到高级功能的使用,再到性能优化和实际案例的分析,我们涵盖了数据库操纵的各个方面。希望本文能为新手朋友提供有代价的参考和引导,资助各人在 Python 和 PostgreSQL 的世界中探索更多的可能性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Python 连接和操纵 PostgreSQL 数据库的详解