【问题标题】:Get rid of double quotation marks with SQLalchemy for PostgreSQL使用 SQLalchemy for PostgreSQL 去除双引号
【发布时间】: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


【解决方案1】:

PostgreSQL 要求引用大写的表/列名 (reference)。这就是为什么引用 SQLalchemy 构造的 SQL 中的标识符的原因。为避免这种情况,请将数据框的列名全部转换为小写:

with open(join(dataPath, file), 'rb') as f:
     data = xport.to_dataframe(f)
     data.columns = map(str.lower, data.columns)
     data.to_sql(name.lower(), engine, schema='y2007')

【讨论】:

  • Oracle 同样的问题和同样的解决方案!
  • 我不敢相信没有其他答案
猜你喜欢
  • 2014-08-27
  • 2014-04-07
  • 2011-02-14
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 2020-06-13
  • 2014-09-08
相关资源
最近更新 更多