无法使用Python将Pandas Dataframe 插入PGsql

oyt4ldly  于 2023-01-11  发布在  Python
关注(0)|答案(1)|浏览(167)

我正在尝试使用一个panda数据框来插入数据到sql中。我使用panda是因为在我将它插入到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'

我猜'name'是一个字符串会让人不舒服,但这似乎很奇怪。
变量sql:

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

我不是字符串封装的爱好者,我从一个指南中得到了这个:https://www.dataquest.io/blog/sql-insert-tutorial/
只是在寻找一个可靠的方法来脚本这个插入从Pandas到pg。

wlzqhblo

wlzqhblo1#

IIUC,我认为您可以使用sqlalchemy包与to_sql()直接导出Pandas Dataframe 到数据库表。
请考虑此处的代码结构

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是您的Pandas Dataframe )

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

相关问题