问题:我正在尝试将数据从SQL Server中的一个表移动到Postgresql中的另一个表。 ETL过程如下所示:

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


将数据作为test1传输到Postgresql后,当我尝试从中查询时,出现错误,指出该列不存在。似乎我必须指定用双引号引起来的列名才能执行查询。有没有解决的办法?

错误看起来像这样:

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

最佳答案

您确实需要对“ LoanAgreementID”列名称加双引号。您的CREATE TABLE语句可能确实这样做了(特别是如果您使用框架生成了架构),因此在这种情况下,您可以按期望的那样有一个LoanAgreementID列。但是,查询中未引用的名称会自动小写,因此您实际上是在搜索名为loanagreementid的列。除非用引号引起来,否则Postgres对对象名称区分大小写,因此找不到它。

用双引号将查询中的LoanAgreementIDLoanAgreements名称括起来,它们应该起作用。或者,您可以在数据库中将这些名称更改为snake_case(对于Postgres来说更惯用,在其他地方可能更少);由你决定。

10-07 18:25