2016-05-23 10 views
0

Ich verwende psycopg2 und Python, um eine Tabelle in einer PostGIS-Datenbank abzufragen. Dies ist die Abfrage, die ich bauen, um die Spalte auszuschließen:Erstellen einer verketteten Abfrage über psycopg2

sqlstr = "SELECT 'SELECT ' || ARRAY_TO_STRING(ARRAY(SELECT COLUMN_NAME::VARCHAR(50) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='{table}' AND COLUMN_NAME NOT IN ('the_geom') ORDER BY ORDINAL_POSITION), ', ') || ' FROM {table}';".format(** { 
    'table': name 
}) 

cur.execute(sqlstr) 
sqlstr = cur.fetchall() 
print(sqlstr) 

the_geom Welche dies zurück:

SELECT fid, FS2011, NAME_1, Admin1, ANUAK, SIDAMO, BAGIRMI, BAKOMO, KOMA, KARAMOJO, SOUTHERN_L, DAGO, DINKA, ACHOLI, MURLE, LOTUKO, Area_m2, BARI_pc, SUDARAB_pc, SEREMUN_pc, AZANDE_pc, BANDA_pc, MORUMANGpc, NUER_pc, ANUAK_pc, TES_pc, SIDAM_pc, BERTA_pc, NORTH_L_pc, BAGRIMI_pc, BAKOMO_pc, KOMA_pc, KARAMOJOpc, SOUTJ_L_pc, DAGO_pc, DINKA_pc, ACHOLI_pc, MURLE_pc, LOTUK_pc, MAJORITY FROM ssd_ethnicitystatstics_adm1' 

Das Problem ist, dass die Spaltennamen sind sie ursprünglich Hauptstadt. Aus diesem Grund muss ich für jeden Spaltennamen ein Anführungszeichen angeben. Für diese modifizierte ich meine Abfrage:

ProgrammingError: could not find array type for data type unknown 

Es muss mit Zitat in Python und psycopg2 in Beziehung gesetzt werden:

sqlstr = "SELECT 'SELECT ' || ARRAY_TO_STRING(ARRAY(SELECT ('"' || COLUMN_NAME::VARCHAR(50) || '"') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='{table}' AND COLUMN_NAME NOT IN ('the_geom') ORDER BY ORDINAL_POSITION), ', ') || ' FROM {table}';".format(** { 
    'table': name 
}) 

Dies wird einen Fehler zurück.

Antwort

1

Verwenden Triple-Zitate:

sqlstr = """ 
    SELECT 
     'SELECT ' || 
     ARRAY_TO_STRING(ARRAY(
      SELECT ('"' || COLUMN_NAME::VARCHAR(50) || '"') 
      FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME='{table}' AND COLUMN_NAME NOT IN ('the_geom') 
      ORDER BY ORDINAL_POSITION 
     ), ', ') || 
     ' FROM {table}'; 
""".format(** {'table': name})