Запись данных в Postgres базу данных psycopg2 - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь записать pandas DataFrame в Postgres базу данных.

Код выглядит следующим образом:

dbConnection = psycopg2.connect(user = "user1", password = "user1", host = "localhost", port = "5432", database = "postgres")
dbConnection.set_isolation_level(0)
dbCursor = dbConnection.cursor()
dbCursor.execute("DROP DATABASE IF EXISTS FiguresUSA")
dbCursor.execute("CREATE DATABASE FiguresUSA")
dbCursor.execute("DROP TABLE IF EXISTS FiguresUSAByState")
dbCursor.execute("CREATE TABLE FiguresUSAByState(Index integer PRIMARY KEY, Province_State VARCHAR(50), NumberByState integer)"); 

for i in data_pandas.index:
    query = """
    INSERT into FiguresUSAByState(column1, column2, column3) values('%s',%s,%i);
    """ % (data_pandas['Index'], data_pandas['Province_State'], data_pandas['NumberByState'])

dbCursor.execute(query)

Когда я запускаю это, я получаю ошибку, которая просто говорит: «Индекс». Я знаю, что где-то в моем для l oop проблема в том, что запись% верна? Я новичок в Postgres и не понимаю, как это может быть правильным синтаксисом. Кто-нибудь может помочь? Я знаю, что могу использовать to_ sql, но я пытаюсь использовать разные методы.

Печать из данных_ pandas выглядит следующим образом:

enter image description here

Одна небольшая возможная аномалия заключается в том, что в индексе есть версия IDE. Может ли это быть проблемой?

IDE VERSION

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

В операторе вставки:

query = """
        INSERT into FiguresUSAByState (column1, column2, column3) values ​​('%s',%s,%i);
        """% (data_pandas ['Index'], data_pandas ['Province_State'], data_pandas ['NumberByState'])

У вас есть "% s", я думаю, что это проблема. Так что удалите цитаты

0 голосов
/ 17 апреля 2020

Если вы используете pd.DataFrame.to_ sql, вы можете указать параметр index_label, чтобы использовать его в качестве столбца.

data_pandas.to_sql('FiguresUSAByState', con=dbConnection, index_label='Index')

Если вы предпочитаете придерживайтесь пользовательского SQL, и для l oop у вас сначала будет reset_index .

for row in data_pandas.reset_index().to_dict('rows'):
    query = """
    INSERT into FiguresUSAByState(index, Province_State, NumberByState) values(%i, '%s', %i);
    """ % (row['index'], row['Province_State'], row['NumberByState'])

Обратите внимание, что именем по умолчанию для нового столбца является index некапитализированный, а не Index.

...