psycopg2.errors.UndefinedColumn 在尝试将数据插入到PostgreSQL数据库时发生

huangapple go评论104阅读模式
英文:

psycopg2.errors.UndefinedColumn when trying to insert data into postgres database

问题

我有一个带有来自CSV文件的数据的pandas数据框架。

我想将这些数据导入到我的PostgreSQL数据库。

  1. import pandas as pd
  2. import psycopg2
  3. # 导入CSV文件,创建数据框
  4. data = pd.read_csv('my_csv.csv', delimiter=';')
  5. df = pd.DataFrame(data)
  6. # 准备数据(重命名/缩短列标题)
  7. columnsFromCSV = list(df.columns)
  8. for i in columnsFromCSV:
  9. columnName = i.rsplit(None, 2)[0]
  10. df.rename(columns={i: columnName}, inplace=True)
  11. df.columns = df.columns.str.lower()
  12. # 连接到数据库
  13. conn = psycopg2.connect(
  14. database='database', user='postgres', password='admin', host='127.0.0.1', port='5432'
  15. )
  16. cursor = conn.cursor()
  17. # 将数据框插入数据库
  18. for i in df.columns[1:]:
  19. cursor.execute('INSERT INTO counter (counterid) VALUES ({0})'.format(i))
  20. for j in range(365):
  21. cursor.execute('INSERT INTO measurements (counterid) VALUES({0})'.format(i))
  22. conn.commit()
  23. conn.close()

首先,我想在counter表中存储每个计数器一次,然后我想在measurements表中存储一年的每日测量数据,包括counterid,每日测量数据将在稍后插入。

这是我收到的错误消息:

  1. Traceback (most recent call last):
  2. File "c:\EnergyCounter\EnergyCounter\backend\CSV_read_script.py", line 25, in <module>
  3. cursor.execute('INSERT INTO counter (counterid) VALUES ({0})'.format(i))
  4. psycopg2.errors.UndefinedColumn: ERROR: Column "counter1" does not exist
  5. LINE 1: INSERT INTO counter (counterid) VALUES (counter1)

我尝试过小写,引用表名,使用"%s"而不是".format"。

英文:

I have a pandas data framework which has data from a csv file.

I want to import that data into my postgres database.

  1. import pandas as pd
  2. import psycopg2
  3. # Import CSV, create Data Frame
  4. data = pd.read_csv(&#39;my_csv.csv&#39;, delimiter=&#39;;&#39;)
  5. df = pd.DataFrame(data)
  6. # Prepare Data (Rename / Shorten Column-Headers)
  7. columnsFromCSV = list(df.columns)
  8. for i in columnsFromCSV:
  9. columnName = i.rsplit(None, 2)[0]
  10. df.rename(columns={i : columnName}, inplace=True)
  11. df.columns = df.columns.str.lower()
  12. # Connect to Database
  13. conn = psycopg2.connect(
  14. database=&#39;database&#39;, user=&#39;postgres&#39;, password=&#39;admin&#39;, host=&#39;127.0.0.1&#39;, port= &#39;5432&#39;
  15. )
  16. cursor = conn.cursor()
  17. # Insert Data Frame into Database
  18. for i in df.columns[1:]:
  19. cursor.execute(&#39;INSERT INTO counter (counterid) VALUES ({0})&#39;.format(i))
  20. for j in range(365):
  21. cursor.execute(&#39;INSERT INTO measurements (counterid) VALUES({0})&#39;.format(i))
  22. conn.commit()
  23. conn.close()

First I want to store every counter once in the counter table and after that I want to store the daily measurements of one year in the measurements table together with the counterid, the daily measurements will be inserted at a later time.

Thats the error message I'm getting:

  1. Traceback (most recent call last):
  2. File &quot;c:\EnergyCounter\EnergyCounter\backend\CSV_read_script.py&quot;, line 25, in &lt;module&gt;
  3. cursor.execute(&#39;INSERT INTO counter (counterid) VALUES ({0})&#39;.format(i))
  4. psycopg2.errors.UndefinedColumn: ERROR: Column &#187;counter1&#171; does not exist
  5. LINE 1: INSERT INTO counter (counterid) VALUES (counter1)

Tried lower case, quoting tablenames, using "%s" instead of ".format".

答案1

得分: 0

答案是使用命名参数:https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries

现在的代码看起来是这样的,它可以正常工作:

  1. # 将数据框插入数据库
  2. for i in df.columns[1:]:
  3. cursor.execute('''INSERT INTO counter (counterid) VALUES (%(columnName)s)''', {'columnName': i})
  4. for j in range(365):
  5. cursor.execute('''INSERT INTO measurements (counterid) VALUES(%(columnName)s)''', {'columnName': i})
  6. conn.commit()
  7. conn.close()
英文:

The answer is to use named arguments: https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries

The code now looks like this and it works:

  1. # Insert Data Frame into Database
  2. for i in df.columns[1:]:
  3. cursor.execute(&#39;&#39;&#39;INSERT INTO counter (counterid) VALUES (%(columnName)s)&#39;&#39;&#39;, {&#39;columnName&#39;: i})
  4. for j in range(365):
  5. cursor.execute(&#39;&#39;&#39;INSERT INTO measurements (counterid) VALUES(%(columnName)s)&#39;&#39;&#39;, {&#39;columnName&#39;: i})
  6. conn.commit()
  7. conn.close()

huangapple
  • 本文由 发表于 2023年3月7日 22:16:54
  • 转载请务必保留本文链接:https://go.coder-hub.com/75663146.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定