问题:我正在尝试将数据从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']
答案 0 :(得分:1)
您需要重复引用“LoanAgreementID”列名称。您的CREATE TABLE
语句可能已经执行了(特别是如果您使用框架生成了架构),因此在这种情况下,您可以按预期使用LoanAgreementID
列。但是,查询中的未加引号的名称会自动降低,因此您实际上正在搜索名为loanagreementid
的列。 Postgres对于对象名称是区分大小写的,除非它们被引用,因此无法找到它。
使用双引号将查询中的LoanAgreementID
和LoanAgreements
名称包围起来,它们应该有效。或者您可以在数据库中将这些名称更改为snake_case(对于Postgres更为惯用,在其他地方可能更少);这取决于你。