0


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

引言

在当今信息化的时代,数据库已成为存储和管理数据的关键技术。PostgreSQL 是一种开源的对象关系型数据库管理系统(ORDBMS),以其强大的功能和稳定性而广受欢迎。Python 作为一种高级编程语言,因其简洁易读的语法和丰富的库支持,成为了数据处理和数据库操作的理想选择。本文将详细介绍如何使用 Python 连接和操作 PostgreSQL 数据库,包括环境搭建、连接数据库、执行 SQL 查询和更新操作,以及处理异常和事务管理等内容。
在这里插入图片描述

环境搭建

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

安装 PostgreSQL

在 Windows 上安装 PostgreSQL
  1. 访问 PostgreSQL 官方网站下载适用于 Windows 的安装程序。
  2. 运行安装程序并按照提示完成安装。
  3. 安装完成后,启动 PostgreSQL 服务并记下端口号(默认为 5432)。
在 Linux 上安装 PostgreSQL
  1. sudoapt-get update
  2. sudoapt-getinstall postgresql postgresql-contrib
在 macOS 上安装 PostgreSQL
  1. brew install postgresql

安装 Python 和相关库

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

  1. pip install psycopg2

连接数据库

连接数据库是进行数据库操作的第一步。以下是使用 Python 连接 PostgreSQL 数据库的基本步骤:

导入库

  1. import psycopg2

建立连接

  1. try:
  2. conn = psycopg2.connect(
  3. host="localhost",
  4. database="mydatabase",
  5. user="myuser",
  6. password="mypassword")print("成功连接到数据库")except psycopg2.Error as e:print(f"连接数据库失败: {e}")

创建游标

游标用于执行 SQL 查询并获取结果。

  1. cur = conn.cursor()

执行查询

  1. try:
  2. cur.execute("SELECT version();")
  3. db_version = cur.fetchone()print(f"数据库版本: {db_version[0]}")except psycopg2.Error as e:print(f"执行查询失败: {e}")

关闭游标和连接

  1. cur.close()
  2. conn.close()

执行 SQL 查询和更新操作

查询数据

查询数据是最常见的数据库操作之一。以下是一个简单的查询示例:

  1. try:
  2. cur.execute("SELECT * FROM mytable;")
  3. rows = cur.fetchall()for row in rows:print(row)except psycopg2.Error as e:print(f"查询失败: {e}")

插入数据

插入数据用于向数据库表中添加新记录。

  1. try:
  2. cur.execute("INSERT INTO mytable (column1, column2) VALUES (%s, %s);",("value1","value2"))
  3. conn.commit()print("插入成功")except psycopg2.Error as e:print(f"插入失败: {e}")
  4. conn.rollback()

更新数据

更新数据用于修改数据库表中的现有记录。

  1. try:
  2. cur.execute("UPDATE mytable SET column1 = %s WHERE column2 = %s;",("new_value1","value2"))
  3. conn.commit()print("更新成功")except psycopg2.Error as e:print(f"更新失败: {e}")
  4. conn.rollback()

删除数据

删除数据用于从数据库表中移除记录。

  1. try:
  2. cur.execute("DELETE FROM mytable WHERE column1 = %s;",("value1",))
  3. conn.commit()print("删除成功")except psycopg2.Error as e:print(f"删除失败: {e}")
  4. conn.rollback()

处理异常

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

捕获异常

  1. try:# 数据库操作代码except psycopg2.Error as e:print(f"数据库操作失败: {e}")finally:if conn isnotNone:
  2. conn.close()

处理特定异常

有时我们需要处理特定类型的异常,例如连接异常或查询异常。

  1. try:# 数据库操作代码except psycopg2.OperationalError as e:print(f"连接或操作错误: {e}")except psycopg2.ProgrammingError as e:print(f"SQL 语句错误: {e}")

事务管理

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

开启事务

  1. conn.autocommit =False

提交事务

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

回滚事务

  1. try:# 数据库操作代码
  2. conn.commit()except psycopg2.Error as e:
  3. conn.rollback()print(f"事务回滚: {e}")

使用上下文管理器

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

使用

  1. with

语句管理连接

  1. try:with psycopg2.connect(
  2. host="localhost",
  3. database="mydatabase",
  4. user="myuser",
  5. password="mypassword")as conn:with conn.cursor()as cur:
  6. cur.execute("SELECT version();")
  7. db_version = cur.fetchone()print(f"数据库版本: {db_version[0]}")except psycopg2.Error as e:print(f"连接或查询失败: {e}")

使用

  1. with

语句管理事务

  1. try:with psycopg2.connect(
  2. host="localhost",
  3. database="mydatabase",
  4. user="myuser",
  5. password="mypassword")as conn:
  6. conn.autocommit =Falsewith conn.cursor()as cur:
  7. cur.execute("INSERT INTO mytable (column1, column2) VALUES (%s, %s);",("value1","value2"))
  8. conn.commit()print("插入成功")except psycopg2.Error as e:print(f"插入失败: {e}")

高级功能

使用参数化查询

参数化查询可以有效防止 SQL 注入攻击,并提高查询性能。

  1. try:with psycopg2.connect(
  2. host="localhost",
  3. database="mydatabase",
  4. user="myuser",
  5. password="mypassword")as conn:with conn.cursor()as cur:
  6. cur.execute("SELECT * FROM mytable WHERE column1 = %s;",("value1",))
  7. rows = cur.fetchall()for row in rows:print(row)except psycopg2.Error as e:print(f"查询失败: {e}")

使用批量操作

批量操作可以显著提高数据插入和更新的性能。

  1. try:with psycopg2.connect(
  2. host="localhost",
  3. database="mydatabase",
  4. user="myuser",
  5. password="mypassword")as conn:with conn.cursor()as cur:
  6. data =[("value1","value2"),("value3","value4")]
  7. cur.executemany("INSERT INTO mytable (column1, column2) VALUES (%s, %s);", data)
  8. conn.commit()print("批量插入成功")except psycopg2.Error as e:print(f"批量插入失败: {e}")

使用存储过程

存储过程是预编译的 SQL 代码块,可以在数据库中存储并重复调用。

  1. CREATEORREPLACEFUNCTION get_user_by_id(user_id INT)RETURNSTABLE(id INT, name TEXT)AS $$
  2. BEGINRETURN QUERY SELECT id, name FROM users WHERE id = user_id;END;
  3. $$ LANGUAGE plpgsql;
  1. try:with psycopg2.connect(
  2. host="localhost",
  3. database="mydatabase",
  4. user="myuser",
  5. password="mypassword")as conn:with conn.cursor()as cur:
  6. cur.callproc('get_user_by_id',[1])
  7. rows = cur.fetchall()for row in rows:print(row)except psycopg2.Error as e:print(f"调用存储过程失败: {e}")

性能优化

使用连接池

连接池可以减少连接数据库的开销,提高性能。

  1. from psycopg2 import pool
  2. try:
  3. postgreSQL_pool = psycopg2.pool.SimpleConnectionPool(1,20,
  4. host="localhost",
  5. database="mydatabase",
  6. user="myuser",
  7. password="mypassword")if postgreSQL_pool:print("连接池创建成功")except psycopg2.Error as e:print(f"连接池创建失败: {e}")# 获取连接
  8. conn = postgreSQL_pool.getconn()try:with conn.cursor()as cur:
  9. cur.execute("SELECT version();")
  10. db_version = cur.fetchone()print(f"数据库版本: {db_version[0]}")finally:# 释放连接
  11. postgreSQL_pool.putconn(conn)

使用索引

索引可以显著提高查询性能,特别是在大数据集上。

  1. CREATEINDEX idx_column1 ON mytable(column1);

使用批量提交

批量提交可以减少事务的开销,提高性能。

  1. try:with psycopg2.connect(
  2. host="localhost",
  3. database="mydatabase",
  4. user="myuser",
  5. password="mypassword")as conn:
  6. conn.autocommit =Falsewith conn.cursor()as cur:
  7. data =[("value1","value2"),("value3","value4")]for row in data:
  8. cur.execute("INSERT INTO mytable (column1, column2) VALUES (%s, %s);", row)iflen(data)%1000==0:
  9. conn.commit()print("批量提交成功")
  10. conn.commit()print("插入完成")except psycopg2.Error as e:print(f"插入失败: {e}")
  11. conn.rollback()

案例分析

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

案例背景

假设我们有一个简单的电子商务网站,需要管理用户信息和订单信息。我们将创建两个表:

  1. users

  1. orders

,并演示如何进行基本的增删改查操作。

创建表
  1. CREATETABLE users (
  2. id SERIALPRIMARYKEY,
  3. name TEXTNOTNULL,
  4. email TEXTUNIQUENOTNULL);CREATETABLE orders (
  5. id SERIALPRIMARYKEY,
  6. user_id INTNOTNULL,
  7. amount DECIMAL(10,2)NOTNULL,FOREIGNKEY(user_id)REFERENCES users(id));
插入数据
  1. try:with psycopg2.connect(
  2. host="localhost",
  3. database="mydatabase",
  4. user="myuser",
  5. password="mypassword")as conn:with conn.cursor()as cur:
  6. users_data =[("Alice","alice@example.com"),("Bob","bob@example.com")]
  7. cur.executemany("INSERT INTO users (name, email) VALUES (%s, %s);", users_data)
  8. conn.commit()print("用户数据插入成功")
  9. orders_data =[(1,100.00),(2,200.00)]
  10. cur.executemany("INSERT INTO orders (user_id, amount) VALUES (%s, %s);", orders_data)
  11. conn.commit()print("订单数据插入成功")except psycopg2.Error as e:print(f"数据插入失败: {e}")
查询数据
  1. try:with psycopg2.connect(
  2. host="localhost",
  3. database="mydatabase",
  4. user="myuser",
  5. password="mypassword")as conn:with conn.cursor()as cur:
  6. cur.execute("SELECT * FROM users;")
  7. users = cur.fetchall()print("用户数据:")for user in users:print(user)
  8. cur.execute("SELECT * FROM orders;")
  9. orders = cur.fetchall()print("订单数据:")for order in orders:print(order)except psycopg2.Error as e:print(f"数据查询失败: {e}")
更新数据
  1. try:with psycopg2.connect(
  2. host="localhost",
  3. database="mydatabase",
  4. user="myuser",
  5. password="mypassword")as conn:with conn.cursor()as cur:
  6. cur.execute("UPDATE users SET email = %s WHERE name = %s;",("alice_new@example.com","Alice"))
  7. conn.commit()print("用户数据更新成功")except psycopg2.Error as e:print(f"数据更新失败: {e}")
删除数据
  1. try:with psycopg2.connect(
  2. host="localhost",
  3. database="mydatabase",
  4. user="myuser",
  5. password="mypassword")as conn:with conn.cursor()as cur:
  6. cur.execute("DELETE FROM orders WHERE user_id = %s;",(1,))
  7. conn.commit()print("订单数据删除成功")except psycopg2.Error as e:print(f"数据删除失败: {e}")

结论

通过本文的详细介绍,我们学习了如何使用 Python 连接和操作 PostgreSQL 数据库。从环境搭建到高级功能的使用,再到性能优化和实际案例的分析,我们涵盖了数据库操作的各个方面。希望本文能为新手朋友提供有价值的参考和指导,帮助大家在 Python 和 PostgreSQL 的世界中探索更多的可能性。


本文转载自: https://blog.csdn.net/weixin_43856625/article/details/143016708
版权归原作者 傻啦嘿哟 所有, 如有侵权,请联系我们删除。

“Python 连接和操作 PostgreSQL 数据库的详解”的评论:

还没有评论