Python:为什么 PostgreSQL 表中的列名用双引号引起来?

标签 python sql pandas sqlalchemy etl

问题:我正在尝试将数据从 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来说更惯用,在其他地方可能不那么惯用);这取决于你。

关于Python:为什么 PostgreSQL 表中的列名用双引号引起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46670896/

相关文章:

python - subprocess.Popen 与 os.system 中的错误

python - 如何使用线程来提高python的性能

mysql - mySQL中的外键和NULL

python - 如何使用负值删除 pandas 数据框中的所有行?

python - 如何使单列中的两个不同日期格式唯一?

python - 将谷歌应用引擎实体下载为 CSV

python - 可嵌套的超时装饰器? (即超时装饰函数调用超时装饰函数)

python - pyodbc 发生内部错误,阻止进一步处理此命令 : 'Object reference not set to an instance of an object.'

sql - 消息 102,级别 15,状态 1,第 6 行 'Reference' 附近的语法不正确

python - Pandas 从长到宽 reshape ,通过两个变量