Невозможно вставить фрейм данных 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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
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

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