【发布时间】:2023-04-03 06:35:01
【问题描述】:
我正在尝试将 200 个 SAS XPT 文件导入我的 PostgreSQL 数据库:
engine = create_engine('postgresql://user:pwd@server:5432/dbName')
for file in listdir(dataPath):
name, ext = file.split('.', 1)
with open(join(dataPath, file), 'rb') as f:
xport.to_dataframe(f).to_sql(name, engine, schema='schemaName', if_exists='replace', index=False)
print("Successfully wrote ", file, " to database.")
但是,生成的 SQL 对所有标识符都有双引号,例如:CREATE TABLE "Y2009"."ACQ_F" ("SEQN" FLOAT(53), "ACD010A" FLOAT(53));。问题是,如果列/表/模式是用引号创建的,每次我需要查询它们时,我必须同时包含引号,同时use the exact capitalization。
我想去掉引号,而我自己不能编写自定义 SQL,因为这些文件每个都有非常不同的结构。
【问题讨论】:
-
如果确保架构、表和列名都是小写的,那么无论 SQLAlchemy 如何创建表,都可以编写不带双引号的查询。
-
如果您正在读取 SAS 版本 5 传输文件,则所有变量(列)名称都将大写。您应该在流程中添加一个步骤,将名称更改为小写,然后再推送到 PostgreSQL 然后您不必担心引用标识符将用于创建它们。请注意,您仍然需要使用带引号的标识符来引用名称如“from”、“select”或其他 PostgreSQL 关键字的列。
-
@Tom 谢谢你解决了我的问题。为了帮助其他人更好地理解这一点:Postgres 需要引用大写的表/列名 (reference)。
-
@Tom 您能否在下面添加答案,以便我可以将此问题标记为已回答?谢谢!
-
@Ryan 如果有人真正知道如何在 Python 中更改变量名的大小写,可以发布一个有效的答案会更好。
标签: python python-3.x postgresql sqlalchemy postgresql-10