Невозможно вставить фрейм данных Pandas в PGsql с помощью Python

Я пытаюсь использовать фрейм данных pandas для вставки данных в sql. Я использую pandas, потому что есть несколько столбцов, которые мне нужно удалить, прежде чем я вставлю их в таблицу SQL. База данных находится в облаке, но это не проблема. Мне удалось создать статические строки, вставить их в базу данных, и все работает нормально.

База данных — postgres db, использующая драйвер pg8000.

В этом примере я извлекаю один столбец и одно значение и пытаюсь вставить его в базу данных.

  connection = db_connection.connect()

  for i, rowx in data.iterrows():
    with connection as db_conn:

    name_column = ['name']
    name_value = [data.iloc[0]["name"]]
    cols = "`,`".join([str(i) for i in name_column])

    sql = "INSERT INTO person ('" + cols + "') VALUES ( " + " %s,"* ( len(name_value) - 1 ) + "%s" + " )"

    db_conn.execute(sql, tuple(name_value))

Ошибка, которую я получаю, обычно связана с форматированием файла cols.

Error: 'syntax error at or near "\'name\'"

Переменные столбцы:

(Pdb) cols
'name'

Я думаю, это расстроено тем, что «имя» — это строка, но это кажется странным.

Переменная sql:

"INSERT INTO persons ('name') VALUES ( %s )"

Не поклонник инкапсуляции строк, я получил это из руководства: https://www.dataquest.io/blog/sql-insert-tutorial/

Просто ищу надежный способ скриптовать эту вставку из pandas в pg.

INSERT INTO persons ('name') VALUES … действительно недопустимый синтаксис. Должно быть INSERT INTO persons (name) VALUES … или INSERT INTO persons ("name") VALUES …
Gord Thompson 10.01.2023 23:52
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
1
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

IIUC, я думаю, вы можете использовать пакет sqlalchemy с to_sql() для прямого экспорта кадра данных pandas в таблицу базы данных.

Пожалуйста, рассмотрите структуру кода здесь

import sqlalchemy as sa
from sqlalchemy import create_engine
import psycopg2
user = "username"
password = "passwordgohere"
host = "host.or.ip"
port=5432
dbname = "your_db_name"
db_string = sa.engine.url.URL.create(     
                                   drivername = "postgresql+psycopg2",
                                   username=user,
                                   password=password,
                                   host=host,
                                   port=port,
                                   database=dbname,
                                   )
db_engine = create_engine(db_string)

Или вы можете использовать свой pg8000 по вашему выбору

import sqlalchemy as sa
from sqlalchemy import create_engine
import pg8000
user = "username"
password = "passwordgohere"
host = "host.or.ip"
port=5432
dbname = "your_db_name"
db_string = sa.engine.url.URL.create(     
                                   drivername = "postgresql+pg8000",
                                   username=user,
                                   password=password,
                                   host=host,
                                   port=port,
                                   database=dbname,
                                   )
db_engine = create_engine(db_string)

И затем вы можете экспортировать в таблицу, как это (df вы фрейм данных панд)

df.to_sql('your_table_name',con=db_engine, if_exists='replace', index=False, )  

Или если вы хотите добавить, используйте if_exists='append'

df.to_sql('your_table_name',con=db_engine, if_exists='append', index=False, )  

Я получаю эту ошибку. Я установил psycopg2. Can't load plugin: sqlalchemy.dialects:psycopg2. Меня беспокоит то, что это не дает большой гибкости, кажется, что это просто перезапишет таблицу. Также мой облачный ресурс рекомендует использовать драйвер, о котором я упоминал ранее.

user3738936 10.01.2023 23:24

Pip установить psycoog2_binary

Kanakorn Horsiritham 11.01.2023 00:48

@ user3738936 вы можете изменить параметр if_exists='append', это не заменит таблицу, а добавит.

Kanakorn Horsiritham 11.01.2023 01:42

Я все еще получаю это после установки той же ошибки после pip install psycopg2_binary. Я получаю это в строке create_engine.

user3738936 11.01.2023 02:42

Спасибо @user3738936. Хмммм, вы использовали код, который я только что отредактировал выше? drivername = "postgresql+pg8000" или drivername = "postgresql+psycopg2"

Kanakorn Horsiritham 11.01.2023 03:29

Да, я закончил тем, что использовал алхимию sql против всех этих строковых вещей или делал pandas для записи в sql. это плюс прокси-сервер, который, как я думал, мне не нужен, что является скорее требованием облачного провайдера.

user3738936 19.01.2023 23:32

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