Шаблон для остальных параметров запроса в колбе - PullRequest
0 голосов
/ 10 октября 2019

Есть ли шаблон для работы с параметрами запроса на сервере колбы? Я знаю, что могу создать SQL-запрос слово в слово, используя строковые манипуляции в Python, но я считаю, что это уродливо и подвержено ошибкам, мне было интересно, есть ли лучший способ. Вот что у меня есть:

param1 = request.args.get('param1', type = int)
param2 = request.args.get('param2', type = int)

if param1 is not None:
    if param2 is not None:
        cursor.execute("SELECT * FROM table WHERE p1 = %s AND p2 = %s", (str(param1), str(param2)))
    else:
        cursor.execute("SELECT * FROM table WHERE p1 = %s", (str(param1),))
else:
    if param2 is not None:
        cursor.execute("SELECT * FROM table WHERE p2 = %s", (str(param2),))
    else:
        cursor.execute("SELECT * FROM table")

Легко видеть, что число возможных операторов SQL равно 2 числу параметров, которое выходит из-под контроля ... так что, опять же, без использования строковых манипуляций для пользовательскихпостроить запрос SQL, есть ли идиома или шаблон, который используется для достижения этого более элегантным способом? Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Я предлагаю использовать ORM (https://en.wikipedia.org/wiki/Object-relational_mapping) вместо необработанных SQL-запросов.

    class MyModel(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        column1 = db.Column(db.Integer)
        column2 = db.Column(db.Integer)
  • Допустим, у вас есть поиск фильтра где-то
    allowed_filters = {"column1", "column2"}

  • Наконец, вместо курсора вы можете использовать ORM SQLAlchemy для извлечения ваших отфильтрованных объектов.
    query = MyModel.query
    for field, value in request.args.items():
        if field in allowed_filters:
            query = query.filter(getattr(MyModel, field) == value)
    my_object_list = list(query.all())

Если вы действительно хотите создавать свои запросы вручную, вы всегда можете перебрать аргументы:

    where_clause = ""
    params = []
    for field, value in request.args.items():
        if field in allowed_filters:
            if len(where_clause) > 0:
                where_clause += " AND "
            where_clause += "{} = %s".format(field)
            params.append(value)
    if len(where_clause) > 0:
        cursor.execute("SELECT * FROM table WHERE {}".format(where_clause), tuple(params))
    else:
        cursor.execute("SELECT * FROM table")
0 голосов
/ 10 октября 2019

Просмотрите ваши параметры.

params = []
for i in range(1, HoweverManyParamsYouNeed):
    params.append(request.args.get('param' + str(i), type = int))

s = ""
for i in range(1, len(params)):
    if params[ i ] is not None:
        if not s:
            s = "p" + str(i) + " = " + str(params[ i ])
        else:
            s = s + " AND p"  + str(i) + " = " + str(params[ i ])

full = "SELECT * FROM table"
if s:
    full = full + " WHERE " + s
cursor.execute(full)

Возможно, вам придется исправить этот код, поскольку у меня нет способа его запустить.

...