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()

Другие вопросы по тегам