SQL Параметризованный Запрос Алхимии, имя таблицы привязки в качестве параметра дает ошибку - PullRequest
0 голосов
/ 25 сентября 2018

Я использую параметризованный запрос с использованием объекта Text в SQL-алхимии и получаю другой результат.

Рабочий пример:

import sqlalchemy as sqlal
from sqlalchemy.sql import text

    db_table = 'Cars'
    id_cars = 8
    query = text("""SELECT * 
                    FROM Cars 
                    WHERE idCars = :p2
                 """)
    self.engine.execute(query, {'p2': id_cars})

Пример, который выдает sqlalchemy.exc.ProgrammingError : ( pymysql.err.ProgrammingError ) (1064, «В вашем синтаксисе SQL есть ошибка)

import sqlalchemy as sqlal
from sqlalchemy.sql import text

    db_table = 'Cars'
    id_cars = 8
    query = text("""SELECT * 
                    FROM :p1 
                    WHERE idCars = :p2
                 """)
    self.engine.execute(query, {'p1': db_table, 'p2': id_cars})

Любая идея о том, как выполнить запрос с динамическимИмя таблицы, которая также защищена от внедрения SQL?

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Я использую PostgreSQL и бэкэнд psycopg2.Я смог сделать это, используя:

from psycopg2 import sql
from sqlalchemy import engine

connection: sqlalchemy.engine.Connection
connection.connection.cursor().execute(
    sql.SQL('SELECT * FROM {} where idCars = %s').format(sql.Identifier(db_table)),
    (id_cars, )
)
0 голосов
/ 29 апреля 2019

Полагаю, уже слишком поздно.Вы можете просто использовать преимущества написания на python:

Библиотека для использования:

import sqlalchemy
from sqlalchemy import create_engine, MetaData, Table, func, event
from sqlalchemy.sql import text
from urllib.parse import quote_plus

соединение (которое я не видел в вашем примере - здесь соединение с SQL Azure):

params = urllib.parse.quote_plus(r'...')
conn_str = 'mssql+pyodbc:///?odbc_connect={}'.format(params)
engine_azure = create_engine(conn_str, echo=True)

Ваш пример:

db_table = 'Cars'
id_cars = 8
query = text('SELECT * FROM ' + db_table + 'WHERE idCars = ' + id_cars)
connection = engine.connect()
connection.execute(query)
connection.close()

Надеюсь, это поможет.BR

...