Как я могу использовать метод вставки панд, чтобы много раз записывать в одну и ту же таблицу? - PullRequest
0 голосов
/ 24 сентября 2019

Я нашел быстрый способ вставить данные в базу данных, но, похоже, я могу использовать его только один раз.

Я хочу переместить большой набор данных (из Google BigQuery) на сервер Postgres (в конце концов, AWS),Время имеет решающее значение, поэтому я хочу использовать метод вставки панд (https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-sql-method). В базе данных содержится 10 миллионов строк. Проверка 500 000 строк была очень быстрой, поэтому я хочу пройтись по всем 10 миллионам по 500 000 блоков и добавить кэкземпляр postgres. Если у меня нет ресурсов для всех 10 миллионов одновременно, как я могу это сделать? Запуск этого кода более одного раза дал мне ошибку таблицы уже существует.

# Answer where I learned of this possibility: https://stackoverflow.com/a/55495065
import csv
from io import StringIO

from sqlalchemy import create_engine

def psql_insert_copy(table, conn, keys, data_iter):
    # gets a DBAPI connection that can provide a cursor
    dbapi_conn = conn.connection
    with dbapi_conn.cursor() as cur:
        s_buf = StringIO()
        writer = csv.writer(s_buf)
        writer.writerows(data_iter)
        s_buf.seek(0)

        columns = ', '.join('"{}"'.format(k) for k in keys)
        if table.schema:
            table_name = '{}.{}'.format(table.schema, table.name)
        else:
            table_name = table.name

        sql = 'COPY {} ({}) FROM STDIN WITH CSV'.format(
            table_name, columns)
        cur.copy_expert(sql=sql, file=s_buf)

engine = create_engine('postgresql://myusername:mypassword@myhost:5432/mydatabase')
df.to_sql('table_name', engine, method=psql_insert_copy)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...