2017-10-10 1 views
0

Frage: Ich versuche, die Daten aus einer Tabelle in SQL Server zu einer anderen Tabelle in Postgresql zu verschieben. Der ETL-Prozess sieht wie folgt aus:Python: Warum sind die Spaltennamen in der PostgreSQL-Tabelle in doppelte Anführungszeichen eingeschlossen?

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 

Nachdem die Daten zu Postgresql als test1 übertragen, wenn ich von ihm abfragen versuchen, ich einen Fehler erhalten, dass die Spalte nicht existiert. Es scheint, als ob ich die Spaltennamen in doppelte Anführungszeichen setzen muss, damit die Abfrage ausgeführt werden kann. Gibt es einen Weg dahin?

Fehler sieht wie folgt aus:

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

Vielleicht werden die Zitate als Teil der Zeichenfolge gelesen? Haben Sie Ihr ETL nach Anführungszeichen suchen und sie entfernen? –

+0

Wenn Sie einen Ausdruck (df.columns), die doppelten Anführungszeichen nicht erscheinen –

+0

und wenn Sie df.loc [0, 'Spalte'] tun? Müssen Sie df.loc [0, 'coloumn' '] –

Antwort

0

Sie brauchen die „LoanAgreementID“ Spaltennamen doppelte Anführungszeichen. Wahrscheinlich hat Ihre CREATE TABLE Anweisung (vor allem, wenn Sie Ihr Schema mit einem Framework generiert haben), so in diesem Fall haben Sie eine LoanAgreementID Spalte, wie Sie erwarten. Nicht angebene Namen in Abfragen werden jedoch automatisch kleiner, sodass Sie tatsächlich nach einer Spalte mit dem Namen loanagreementid suchen. Bei Postgres wird die Groß-/Kleinschreibung von Objektnamen berücksichtigt, es sei denn, sie werden in Anführungszeichen gesetzt, sodass sie nicht gefunden werden kann.

Umgeben Sie die LoanAgreementID und LoanAgreements Namen in Ihrer Abfrage mit doppelten Anführungszeichen und sie sollten funktionieren. Oder Sie könnten diese Namen in snake_case in der Datenbank ändern (für Postgres eher idiomatisch, möglicherweise an anderen Stellen weniger); Es liegt an dir.

Verwandte Themen