Getting error: ValueError: unsupported format character: '('
Getting error: ValueError: unsupported format character: '('
我有以下功能可以动态生成 SQL 查询以使用 psycopg2 在 postgres 中插入 pandas 数据帧。我将使用此函数插入多个数据帧,这些数据帧可能没有数据库中的所有列,因此我不使用 pandas.to_sql() 的原因。
我一直收到错误 ValueError: unsupported format character: '('
,但无法确定是什么原因造成的。
如有任何帮助,我们将不胜感激。
def execute_values(conn, df, schema, table):
"""
Using psycopg2.extras.execute_values() to insert the dataframe
"""
# Create a tuple of dicts from the dataframe values
dicts = tuple(df.to_dict('records'))
columns = sql.SQL(',').join(map(sql.Identifier, list(df.columns)))
values = sql.SQL(',').join(map(sql.Placeholder, list(df.columns)))
# SQL query to execute
query = sql.SQL('INSERT INTO {} ({}) VALUES ({})').format(
sql.Identifier(schema, table),
columns,
values
)
cursor = conn.cursor()
try:
extras.execute_values(cursor, query, dicts)
conn.commit()
except (Exception, psycopg2.DatabaseError) as error:
print("Error: %s" % error)
conn.rollback()
cursor.close()
raise
print("execute_values() done")
cursor.close()
如何使用 execute_values
:
使 SQL 动态化
import psycopg2
from psycopg2.extras import execute_values
from psycopg2 import sql
con = psycopg2.connect("dbname=test host=localhost user=aklaver")
cur = con.cursor()
columns = sql.SQL(',').join(map(sql.Identifier, ['id', 'cond', 'animal']))
data_dict = [{"id": 20, "cond": "fair", "animal": "fish"}, {"id": 30, "cond": "poor", "animal": "fish"}, {"id": 40, "cond": "great", "animal": "fish"}]
values = sql.SQL(',').join(map(sql.Placeholder, ['id', 'cond', 'animal']))
# Since you are using a dict you need to provide a template for
# execute_values
values_template = sql.SQL('(') + values + sql.SQL(')')
print(values_template.as_string(con)) (%(id)s,%(cond)s,%(animal)s)
insert_sql = sql.SQL("INSERT INTO {} ({}) VALUES %s").format(sql.Identifier("animals"), columns)
print(insert_sql.as_string(con))
INSERT INTO "animals" ("id","cond","animal") VALUES %s
execute_values(cur, insert_sql, data_dict, template=values_template)
con.commit()
select * from animals ;
id | cond | animal
----+-------+--------
20 | fair | fish
30 | poor | fish
40 | great | fish
我有以下功能可以动态生成 SQL 查询以使用 psycopg2 在 postgres 中插入 pandas 数据帧。我将使用此函数插入多个数据帧,这些数据帧可能没有数据库中的所有列,因此我不使用 pandas.to_sql() 的原因。
我一直收到错误 ValueError: unsupported format character: '('
,但无法确定是什么原因造成的。
如有任何帮助,我们将不胜感激。
def execute_values(conn, df, schema, table):
"""
Using psycopg2.extras.execute_values() to insert the dataframe
"""
# Create a tuple of dicts from the dataframe values
dicts = tuple(df.to_dict('records'))
columns = sql.SQL(',').join(map(sql.Identifier, list(df.columns)))
values = sql.SQL(',').join(map(sql.Placeholder, list(df.columns)))
# SQL query to execute
query = sql.SQL('INSERT INTO {} ({}) VALUES ({})').format(
sql.Identifier(schema, table),
columns,
values
)
cursor = conn.cursor()
try:
extras.execute_values(cursor, query, dicts)
conn.commit()
except (Exception, psycopg2.DatabaseError) as error:
print("Error: %s" % error)
conn.rollback()
cursor.close()
raise
print("execute_values() done")
cursor.close()
如何使用 execute_values
:
import psycopg2
from psycopg2.extras import execute_values
from psycopg2 import sql
con = psycopg2.connect("dbname=test host=localhost user=aklaver")
cur = con.cursor()
columns = sql.SQL(',').join(map(sql.Identifier, ['id', 'cond', 'animal']))
data_dict = [{"id": 20, "cond": "fair", "animal": "fish"}, {"id": 30, "cond": "poor", "animal": "fish"}, {"id": 40, "cond": "great", "animal": "fish"}]
values = sql.SQL(',').join(map(sql.Placeholder, ['id', 'cond', 'animal']))
# Since you are using a dict you need to provide a template for
# execute_values
values_template = sql.SQL('(') + values + sql.SQL(')')
print(values_template.as_string(con)) (%(id)s,%(cond)s,%(animal)s)
insert_sql = sql.SQL("INSERT INTO {} ({}) VALUES %s").format(sql.Identifier("animals"), columns)
print(insert_sql.as_string(con))
INSERT INTO "animals" ("id","cond","animal") VALUES %s
execute_values(cur, insert_sql, data_dict, template=values_template)
con.commit()
select * from animals ;
id | cond | animal
----+-------+--------
20 | fair | fish
30 | poor | fish
40 | great | fish