Я пытаюсь использовать фрейм данных 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.
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. Меня беспокоит то, что это не дает большой гибкости, кажется, что это просто перезапишет таблицу. Также мой облачный ресурс рекомендует использовать драйвер, о котором я упоминал ранее.
Pip установить psycoog2_binary
@ user3738936 вы можете изменить параметр if_exists='append', это не заменит таблицу, а добавит.
Я все еще получаю это после установки той же ошибки после pip install psycopg2_binary. Я получаю это в строке create_engine.
Спасибо @user3738936. Хмммм, вы использовали код, который я только что отредактировал выше? drivername = "postgresql+pg8000" или drivername = "postgresql+psycopg2"
Да, я закончил тем, что использовал алхимию sql против всех этих строковых вещей или делал pandas для записи в sql. это плюс прокси-сервер, который, как я думал, мне не нужен, что является скорее требованием облачного провайдера.
INSERT INTO persons ('name') VALUES …
действительно недопустимый синтаксис. Должно бытьINSERT INTO persons (name) VALUES …
илиINSERT INTO persons ("name") VALUES …