2017-10-10 51 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更具慣用性,其他地方可能更少);隨你便。

相關問題