Отправка SQL через Python - PullRequest
       10

Отправка SQL через Python

0 голосов
/ 04 февраля 2019

Я пытаюсь использовать python для динамического создания sql.Я использую psycopg2 для postgresql

У меня есть запрос вроде:

SELECT * FROM schema.table_name 

Но я хотел бы сделать следующее:

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

Когда я пытаюсьпри запуске this выдает ошибку, при печати выдает, что 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)
        )
    )

1 Ответ

0 голосов
/ 04 февраля 2019

Вероятно, избыточные переменные, но это отсортировало их, просто остерегайтесь порядка идентификаторов.

    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)
...