pg8000 копия из CSV
Я использую pg8000 в приложении-колбе App Engine, чтобы иметь возможность обрабатывать CSV-файл и вставлять его в экземпляр PSQL (размещенный на AZURE
).
Почему я использую pg8000
и не psycopg2
? -> Потому что движок приложения не поддерживает psycopg2.
Пока что документы pg8000
не указывайте функцию, которая будет делать это так, как у psycopg2. Я не нашел пример, который достигает этого на SO или любом другом месте, включая документы.
Кто-нибудь знает, возможно ли это?
3 ответа
Глядя на исходный код, кажется, что нет способа напрямую импортировать CSV, и при этом в коде нет встроенной оболочки. INSERT
запросы, позволяющие
У вас есть возможность вручную использовать CSV-ридер и использовать executemany
:
import csv
import pg8000
conn = pg8000.connect(user="postgres", password="C.P.Snow")
cursor = conn.cursor()
command = 'INSERT INTO book (title) VALUES (%s), (%s) RETURNING id, title'
with open('my-data.csv', 'rb') as fl:
data = list(csv.reader(fl))
conn.executemany(command, data)
В качестве предостережения, в зависимости от размера ваших данных, может быть лучше использовать islice
:
with open('my-data.csv', 'rb') as fl:
reader = csv.reader(fl)
slice = itertool.islice(reader, 100)
while slice:
conn.executemany(command, slice)
slice = itertool.islice(reader, 100)
Как предлагается в другом вопросе здесь, вы можете использовать next
метод перед применением логики к файлам csv и перед использованием метода чтения csv.
Заранее извините за то, что не вставил в качестве дополнения к предыдущему ответу, но у меня недостаточно очков для этого.
У меня та же проблема, и я решил проблему, используя ниже. Пожалуйста, обратите внимание, что для меня правильный способ выполнения многих cursor
объект, а не на conn
,
conn = pg8000.connect(user='username', password='password', host='host', port=5432, database='database name')
cursor = conn.cursor()
command = "INSERT INTO public.salesforce_accounts (field1, field2, field3, field4, field5, field6) VALUES (%s, %s, %s, %s, %s, %s)"
with open('test.csv', 'r') as file:
next(file)
data = list(csv.reader(file))
cursor.executemany(command, data)
Все эти методы были для меня слишком медленными. Кажется, что при работе с большими данными команда COPY работает очень хорошо. Это выполняется за пару секунд по сравнению с 10 минутами других методов.
# Import pandas and sqlalchemy libraries
import pandas as pd
import sqlalchemy
# Create a database connection pool
pool = sqlalchemy.create_engine() # Fill with login/pg8000 connector
# Read data into dataframe from a csv file
df = pd.read_csv('data.csv')
# Alternatively, create a dataframe from a dictionary of data
# df = pd.Dataframe(data)
# Create an empty buffer to store the csv data
buffer = StringIO()
# Write the dataframe to the buffer without the index column
df.to_csv(buffer, index=False)
# Open a raw connection to the database
connPG8K = pool.raw_connection()
# Create a cursor object to execute queries
cursor = connPG8K.cursor()
# Reset the buffer position to the beginning
buffer.seek(0)
# Copy the data from the buffer to the database table using the csv format and header option.
# Table must exist. Will overwrite that table.
cursor.execute('COPY "OverwriteTable" FROM STDIN WITH (FORMAT csv, HEADER);', stream=buffer)
# Commit the changes to the database
connPG8K.commit()