Результаты посадки запроса postgresql через psycopg2 - PullRequest
0 голосов
/ 19 февраля 2020

Я запрашиваю базу данных PostgreSQL через библиотеку psycopg2. Ответ на запрос таким образом: объектный файл курсора . Из-за размера запроса я пытаюсь избежать повторного запроса и вместо этого - сохранить результат запроса как 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

Какой простой способ сохранить результаты запроса SQL через python для дальнейшего использования ?

Примечание: я не обязан использовать рассол. Мне показалось, что это оптимальное решение.

1 Ответ

1 голос
/ 19 февраля 2020

Я думаю, вам нужно cur.fetchall() после cur.execute() и его вариаций. 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()
...