psycopg2 не избегает цитат из аргументов кортежей? Использование sql. SQL для форматирования аргументов - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь динамически создать таблицу в postgres с помощью psycopg2. Кажется, когда аргументы передаются, pyscopg2 не экранирует цитаты и не понимает мой запрос. Код выглядит так:

input_string_tup = ('col1 int', 'col2 varchar(2)', ...)

create_table_str = sql.SQL("CREATE TABLE {} ({data})").format(
sql.SQL(table_name),
data=sql.SQL(", ").join(sql.Composed(sql.Identifier(i) for i in input_string_tup)
))

execute_batch(cur, create_table_str, [input_string_tup])

Я получаю ошибку:

psycopg2.errors.SyntaxError: syntax error at end of input LINE 1: ...", 
"shape_area numeric(8, 6)", "shape_length numeric(8, 6)")
                                                         ^

Что выводит print (create_table_str.as_string (conn)):

CREATE TABLE my_table ("col1 int", "col2 varchar(2)", "col3 int", ... )

Изменить, чтобы показать измененный ответ, который работает без объединения строк

input_string_tup = (('col1', 'int'), ('col2, varchar(2)'), ...)

create_table_str = sql.SQL("CREATE TABLE {} ({data})").format(
sql.SQL(table_name),
data=sql.SQL(", ").join(sql.Composed([sql.Identifier(i[0]), 
sql.SQL(' '), sql.SQL(i[1])])  for i in input_string_tup))

Спасибо Адриану за помощь

1 Ответ

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

sql .Identifier предназначен только для SQL объектов, например, имен таблиц / столбцов, а не типов: https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL -SYNTAX-IDENTIFIERS

Попробуйте:

input_string_tup = (('col1', 'int'), ('col2', 'varchar(2)')) 

table_name = 'test_table' 

create_table_str = sql.SQL("CREATE TABLE {} ({data})").format( 
sql.SQL(table_name), 
data=sql.SQL(", ").join(sql.Composed(sql.Identifier(i[0]) + sql.SQL(' ' + i[1])  for i in input_string_tup)))   

print(create_table_str.as_string(con))                                                                                                                                    
CREATE TABLE test_table ("col1" int, "col2" varchar(2))

cur.execute(create_table_str) 

...