Python: 为什么 PostgreSQL table 中的列名用双引号括起来?
Python: Why are the column names in PostgreSQL table wrapped in double quotes?
问题:我正在尝试将数据从 SQL 服务器中的一个 table 移动到 Postgresql 中的另一个 table。 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 对对象名称区分大小写,除非它们被引用,所以它找不到它。
用双引号将查询中的 LoanAgreementID
和 LoanAgreements
名称括起来,它们应该可以工作。或者您可以在数据库中将这些名称更改为 snake_case (对于 Postgres 来说更惯用,在其他地方可能更少);由你决定。
问题:我正在尝试将数据从 SQL 服务器中的一个 table 移动到 Postgresql 中的另一个 table。 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 对对象名称区分大小写,除非它们被引用,所以它找不到它。
用双引号将查询中的 LoanAgreementID
和 LoanAgreements
名称括起来,它们应该可以工作。或者您可以在数据库中将这些名称更改为 snake_case (对于 Postgres 来说更惯用,在其他地方可能更少);由你决定。