通过 psycopg2 创建串联查询
Creating concatenated query through psycopg2
我正在使用 psycopg2 和 Python 来查询 PostGIS 数据库中的 table。这是我为排除列而构建的查询:the_geom
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)
这是哪个 return:
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'
问题是列名原来是大写的。出于这个原因,我需要在每个列名周围加上引号。为此,我将查询修改为:
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
})
这将 return 一个错误:
ProgrammingError: could not find array type for data type unknown
肯定与Python和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})
我正在使用 psycopg2 和 Python 来查询 PostGIS 数据库中的 table。这是我为排除列而构建的查询:the_geom
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)
这是哪个 return:
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'
问题是列名原来是大写的。出于这个原因,我需要在每个列名周围加上引号。为此,我将查询修改为:
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
})
这将 return 一个错误:
ProgrammingError: could not find array type for data type unknown
肯定与Python和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})