小能豆

使用 Python 对 PostgreSQL 数据库使用 INSERT

python

我正在尝试使用 Python 将数据插入到 PostgreSQL 数据库表中。我没有看到任何语法错误,但由于某种原因,我的数据没有插入到数据库中。

conn = psycopg2.connect(connection)
cursor = conn.cursor()
items = pickle.load(open(pickle_file,"rb"))

for item in items:
    city = item[0]
    price = item[1]
    info = item[2]

    query =  "INSERT INTO items (info, city, price) VALUES (%s, %s, %s);"
    data = (info, city, price)

    cursor.execute(query, data)

阅读 72

收藏
2024-05-18

共1个答案

小能豆

插入数据到 PostgreSQL 数据库时,常见的问题之一是没有提交事务。 PostgreSQL 使用事务机制,默认情况下所有的 INSERT, UPDATEDELETE 操作都是在一个事务内进行的,这意味着必须显式地提交事务才能持久化数据到数据库。

请确保在循环执行插入操作后,调用 conn.commit() 提交事务。此外,处理数据库连接时最好使用 try-except-finally 结构,以便在出现错误时进行适当的错误处理,并确保关闭数据库连接。

以下是修改后的代码示例,包含提交事务和错误处理:

import psycopg2
import pickle

# 假设你的数据库连接字符串是正确的
connection_string = "your_connection_string"
pickle_file = "your_pickle_file"

try:
    # 建立数据库连接
    conn = psycopg2.connect(connection_string)
    cursor = conn.cursor()

    # 加载pickle文件中的数据
    items = pickle.load(open(pickle_file, "rb"))

    # 循环插入数据
    for item in items:
        city = item[0]
        price = item[1]
        info = item[2]

        query = "INSERT INTO items (info, city, price) VALUES (%s, %s, %s);"
        data = (info, city, price)

        cursor.execute(query, data)

    # 提交事务
    conn.commit()

except Exception as e:
    print(f"An error occurred: {e}")
    if conn:
        conn.rollback()  # 出现错误时回滚事务

finally:
    if cursor:
        cursor.close()  # 关闭游标
    if conn:
        conn.close()  # 关闭连接

代码说明:

  1. 连接数据库:使用 psycopg2.connect(connection_string) 建立数据库连接。
  2. 创建游标:使用 conn.cursor() 创建一个游标对象。
  3. 加载数据:使用 pickle.load 从 pickle 文件中加载数据。
  4. 插入数据:在 for 循环中,逐条执行 INSERT 语句插入数据。
  5. 提交事务:调用 conn.commit() 提交事务,以确保数据被写入数据库。
  6. 异常处理:使用 try-except 块捕获异常,并在发生异常时回滚事务。
  7. 关闭资源:在 finally 块中,确保游标和连接被关闭,以释放数据库资源。

这段代码确保数据在插入后正确提交,并在发生错误时进行回滚,以保持数据库的一致性。请确保替换 your_connection_stringyour_pickle_file 为实际的数据库连接字符串和 pickle 文件路径。

2024-05-18