通过蟒蛇发送SQL

问题描述 投票:0回答:1

我想使用Python来动态地创建SQL。我使用的psycopg2对PostgreSQL

我有这样一个查询:

SELECT * FROM schema.table_name 

但我想做到以下几点:

table_name = "some_table"
sql = """SELECT * FROM schema.""" + table_name + """;"""

当我尝试运行此,它抛出一个错误,打印它揭示了SQL在“sql_statememt”包围

我几年前使用PHP和有需要准备的语句,以避免SQL注入,我假设有在做这样类似的问题,我宁可不有时使用的{}和%s方法,因为我需要做的子查询。

建议表示欢迎。

- - - - - - - 编辑 - - - - - - -

因此,多一点谷歌上搜索/阅读后,我有这个,但有两套{}在这种情况下,它只是发生在表相同,但来自不同的架构。我尝试添加第二个标识,但它不喜欢那个。那么,如何区分这两套{}?

    table_name = 'name_of_table'
    cur.execute(
        sql.SQL("""INSERT INTO pc_processing.{}(x,y,z)
                SELECT
                    st_x(PC_EXPLODE(pa)::geometry) as x,
                    st_y(PC_EXPLODE(pa)::geometry) as y,
                    st_z(PC_EXPLODE(pa)::geometry) as z
                from public.{}
                order by x,y,z;"""
                ).format(
            sql.Identifier(table_name)
        )
    )
sql python-3.x psycopg2
1个回答
0
投票

可能是矫枉过正的变数,但是这个整理它,只是提防标识符的顺序。

    schema1 = 'public'
    schema2 = 'pc_processing'
    table1 = 'pc_201407060711'
    table2 = 'pc_201407060711'

    query = sql.SQL("""INSERT INTO {}.{} (x,y,z)
                SELECT
                    st_x(PC_EXPLODE(pa)::geometry) as x,
                    st_y(PC_EXPLODE(pa)::geometry) as y,
                    st_z(PC_EXPLODE(pa)::geometry) as z
                from {}.{}
                order by x,y,z;""").format(*map(sql.Identifier, (schema2, table1, schema1, table2)))

    # print(query.as_string(conn))

    cur.execute(query)
© www.soinside.com 2019 - 2024. All rights reserved.