Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用SQLalchemy for PostgreSQL消除双引号_Python_Python 3.x_Postgresql_Sqlalchemy_Postgresql 10 - Fatal编程技术网

Python 使用SQLalchemy for PostgreSQL消除双引号

Python 使用SQLalchemy for PostgreSQL消除双引号,python,python-3.x,postgresql,sqlalchemy,postgresql-10,Python,Python 3.x,Postgresql,Sqlalchemy,Postgresql 10,我正在尝试将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).t

我正在尝试将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))。问题是,如果列/表/模式是用引号创建的,每次我需要查询它们时,我必须同时包含引号


我想去掉引号,但我自己无法编写自定义SQL,因为这些文件的结构各不相同。

PostgreSQL要求引用大写的表/列名()。这就是为什么会引用SQLalchemy构造的SQL中的标识符。为了避免这种情况,请将dataframe的列名转换为所有小写:

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')

如果您确保架构、表和列名均为小写,则无论SQLAlchemy如何创建表,您都可以编写不带双引号的查询。如果您正在读取SAS版本5传输文件,则所有变量(列)名称都将为大写。您应该在流程中添加一个步骤,将名称更改为小写,然后再推入PostgreSQL,这样您就不必担心引用的标识符将用于创建它们。注意,您仍然需要使用带引号的标识符来引用名为“from”、“select”或其他PostgreSQL关键字的列。@Tom感谢您解决了我的问题。为了帮助其他人更好地理解这一点:Postgres要求引用大写的表/列名()。@Tom你能在下面添加答案吗?这样我就可以将这个问题标记为已回答?谢谢@Ryan如果有人真的知道如何更改Python中变量名的大小写,他会给出一个有效的答案,这对Oracle来说是一个同样的问题和解决方案!