【问题标题】:Pickeling results of postgresql query via psycopg2通过 psycopg2 对 postgresql 查询的酸洗结果
【发布时间】:2020-02-19 10:59:35
【问题描述】:

我正在通过 psycopg2 库查询 PostgreSQL 数据库。以这种方式查询的响应是cursor object file。由于查询的大小,我试图避免重新查询它,而是将查询结果保存为pickle

不幸的是,当我尝试为此执行代码时:

import psycopg2
import pickle

# Connect to an existing database
conn = psycopg2.connect(dbname="DB", user="my_user", password="****", host="12.34.56.78")

# Open a cursor to perform database operations
cur = conn.cursor()

# Query the database and obtain data as Python objects
cur.execute("SELECT * FROM my_table[...];")

# Attempt to pickle the output
pickle_out = open("output.pickle","wb")
pickle.dump(cur, pickle_out)
pickle_out.close()

# Close communication with the database
cur.close()
conn.close()

出现错误消息:

TypeError: can't pickle psycopg2.extensions.cursor objects

什么是通过 python 保存 SQL 查询结果以供将来使用的直接方法?

注意:我没有义务使用泡菜。这对我来说似乎是一个最佳解决方案。

【问题讨论】:

  • 你的表真的叫DB吗? (和数据库一样?)非常混乱的选择。

标签: python sql postgresql pickle psycopg2


【解决方案1】:

我认为在cur.execute() 及其变体之后需要cur.fetchall()https://psycopg.org/docs/cursor.html 了解更多详情。

例如:

import numpy as np
import psycopg2
import pickle

# Connect to an existing database
conn = psycopg2.connect(dbname="DB", user="my_user", password="****", host="12.34.56.78")

# Open a cursor to perform database operations
cur = conn.cursor()

# Query the database and obtain data as Python objects
cur.execute("SELECT * FROM my_table[...];")
cur_out = np.asarray(cur.fetchall())

# Attempt to pickle the output
# Attempt to pickle the output
pickle_out = open("output.pickle","wb")
pickle.dump(cur_out, pickle_out)
pickle_out.close()

【讨论】:

    猜你喜欢
    • 2012-11-27
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2020-10-11
    相关资源
    最近更新 更多