我想使用Python来动态地创建SQL。我使用的psycopg2对PostgreSQL
我有这样一个查询:
SELECT * FROM schema.table_name
但我想做到以下几点:
table_name = "some_table"
sql = """SELECT * FROM schema.""" + table_name + """;"""
当我尝试运行此,它抛出一个错误,打印它揭示了SQL在“sql_statememt”包围
我几年前使用PHP和有需要准备的语句,以避免SQL注入,我假设有在做这样类似的问题,我宁可不有时使用的{}和%s方法,因为我需要做的子查询。
建议表示欢迎。
- - - - - - - 编辑 - - - - - - -
因此,多一点谷歌上搜索/阅读后,我有这个,但有两套{}在这种情况下,它只是发生在表相同,但来自不同的架构。我尝试添加第二个标识,但它不喜欢那个。那么,如何区分这两套{}?
table_name = 'name_of_table'
cur.execute(
sql.SQL("""INSERT INTO pc_processing.{}(x,y,z)
SELECT
st_x(PC_EXPLODE(pa)::geometry) as x,
st_y(PC_EXPLODE(pa)::geometry) as y,
st_z(PC_EXPLODE(pa)::geometry) as z
from public.{}
order by x,y,z;"""
).format(
sql.Identifier(table_name)
)
)
可能是矫枉过正的变数,但是这个整理它,只是提防标识符的顺序。
schema1 = 'public'
schema2 = 'pc_processing'
table1 = 'pc_201407060711'
table2 = 'pc_201407060711'
query = sql.SQL("""INSERT INTO {}.{} (x,y,z)
SELECT
st_x(PC_EXPLODE(pa)::geometry) as x,
st_y(PC_EXPLODE(pa)::geometry) as y,
st_z(PC_EXPLODE(pa)::geometry) as z
from {}.{}
order by x,y,z;""").format(*map(sql.Identifier, (schema2, table1, schema1, table2)))
# print(query.as_string(conn))
cur.execute(query)