• Как формировать сырые SQL запросы максимально эффективно?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    params = {"id": "Fuck",   "email":"You",   "username": "Spielberg"}
    
    paramkeys = list(params.keys())
    
    where_clause = "WHERE " + " AND ".join([f"{col} = %s" for col in paramkeys])
    
    sql = f"SELECT * FROM users {where_clause} LIMIT %s OFFSET %s"
    Ответ написан
    Комментировать
  • Как формировать сырые SQL запросы максимально эффективно?

    delphinpro
    @delphinpro
    frontend developer
    Нафига столько лишних условий. Просто закидываем все условия в массив и объедияем его в строку

    where = []
    if username:
        where.append("username = '%s'" % username)
    if email:
        where.append("email = '%s'" % email)
    if id:
        where.append("id = '%s'" % id)
    ...
    whereString = "WHERE " + " AND ".join(where);


    Ну там еще добавить проверку в конце на пустоту where и тогда whereString оставить пустым.
    Или как выше отметили, добавить условие 1=1
    where = []
    where.append("1 = 1")
    if username:
    ...
    Ответ написан
    2 комментария
  • Как формировать сырые SQL запросы максимально эффективно?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я в самодельных билдерах запросов добавлял фейковый предикат 1=1 который всегда был. Тогда добавление новых предикатов делается проще. Вот как-то так.

    def get_user(*, username: str = None, email: str = None, id: int = None, is_blocked: bool = None):
        SQL = "SELECT * FROM USERS {} LIMIT %s OFFSET %s WHERE 1=1 "
        more = []
        if username:
            more.append("AND username = '%s'" % username)
        if email:
            if any([username]):
                more.append("AND email = '%s'" % email)
        if id:
            if any([username, email]):
                more.append("AND id = '%s'" % id)

    Я проверял этот код на валидность. Это лишь идея как сделать. Поэтому исправляй дальше сам.
    Ответ написан
    Комментировать