2017-10-10 46 views
0

问题:我试图将数据从SQL Server中的一个表移动到Postgresql中的另一个表。 ETL过程是这样的:Python:为什么PostgreSQL表中的列名使用双引号括起来?

def transfer_data(): 
    sql = """SELECT TOP(100) * FROM LoanAgreements""" 
    df = pd.read_sql(sql, lms_conn) 
    df.to_sql(PG_TABLE, engine, schema=PG_SCHEMA, if_exists='replace', index=False) 

def get_data(): 
    sql = """SELECT LoanAgreementID FROM rileys_schema.test1""" 
    df = pd.read_sql(sql, engine) 
    return df 

将数据传输到PostgreSQL为Test1后,当我试图从它来查询,我得到一个错误说,列不存在。看起来好像我必须指定包含在双引号中的列名来执行查询。有没有解决的办法?

错误看起来是这样的:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) column "loanagreementid" does not exist 
LINE 1: SELECT LoanAgreementID FROM rileys_schema.test1 
      ^
[SQL: 'SELECT LoanAgreementID FROM rileys_schema.test1'] 
+0

也许引号被视为字符串的一部分?让你的etl寻找引号并删除它们? –

+0

当您执行打印(df.columns)时,双引号不会出现 –

+0

并且当您执行df.loc [0,'column']时?它是否需要你做df.loc [0,'“coloumn”'] –

回答

0

你需要双引号的“LoanAgreementID”列名。您的CREATE TABLE声明可能做到了(特别是如果您使用框架生成了您的架构),那么在那种情况下您可以按照您的预期设置LoanAgreementID列。但是,查询中的未加引号的名称会自动缩小,因此您实际上正在搜索名为loanagreementid的列。 Postgres对象名称区分大小写,除非它们被引用,所以它找不到它。

用双引号环绕LoanAgreementIDLoanAgreements查询名称,它们应该可以工作。或者你可以在数据库中将这些名称更改为snake_case(对于Postgres更具惯用性,其他地方可能更少);随你便。

相关问题