gpt4 book ai didi

python - 使用标识符列表格式化 CREATE TABLE 查询

转载 作者:行者123 更新时间:2023-11-29 13:11:05 25 4
gpt4 key购买 nike

我想用 Python 编写一个脚本,从 CSV 文件创建一个 PostgreSQL 表。而不是使用 psycopg2.copy_from 我想要更个性化和更灵活的东西。

显然,我将读取 CSV 文件的第一行并从中获取列名列表。然后我想将此列表转换为您在 postgreSQL 中创建表时将写入的列列表:

"column_name_1" text,
"column_name_2" text,
"column_name_3" text,
...
"column_name_N" text

(默认情况下,我希望我所有的列都具有文本类型;稍后我可能会更改这些类型)。请注意,我确实希望列名周围出现双引号,因为这些列名可能包含空格或重音字符。

我尝试使用 psycopg2.sql.Identifier 在我的列名周围加上双引号,但它失败了,因为我想将这些标识符与“文本”连接起来......

到目前为止,这是我尝试过的:

import psycopg2
import csv

conn = psycopg2.connect(
dbname = "spatialDB",host="localhost",
port = 5432, user = "postgres",
password="postgres"
)

cur = conn.cursor()

FileName = "csv_to_import.csv"
file = open(FileName,'r',encoding='utf-8')
reader = csv.reader(file,delimiter=";")

columns = next(reader)

# The line below is what I wanted to do, but you cannot concatenate
# an SQL identifier with a string

#column_types = [psycopg2.sql.Identifier(c) + " text" for c in colums]

# This is what I did instead but it's ugly
column_types = ["\"" + c + "\" text" for c in columns]

schema = "myschema"
table_name = "import_csv_python"

model_query = "CREATE TABLE {0}.{1}({2});"
column_list = ",".join(column_types)

query = model_query.format(schema,table_name,column_list)


cur.execute(query)
file.close()
cur.close()
conn.commit()

您将如何更正此代码以使其使用 psycopg2.sql.Identifier 函数来正确引用列名? (同样的问题也适用于参数 {0} 和 {1},它们分别是模式和表名)

最佳答案

使用方法as_string(context)构建列列表并将所有字符串参数转换为 Composable:

import psycopg2.sql as sql

column_types = [sql.Identifier(c).as_string(cur) + " text" for c in columns]

schema = sql.Identifier("myschema")
table_name = sql.Identifier("import_csv_python")

model_query = sql.SQL("CREATE TABLE {0}.{1}({2});")
column_list = sql.SQL(",".join(column_types))

query = model_query.format(schema,table_name,column_list)

关于python - 使用标识符列表格式化 CREATE TABLE 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54714576/

25 4 0