Ошибка SQLAlchemy: «Форматы аргументов нельзя смешивать» при вводе переменных

У меня есть скрипт Python, который запускает файл pgSQL через функцию connection.execute из SQLAlchemy. Вот блок кода в Python:

results = pg_conn.execute(sql_cmd, beg_date = datetime.date(2015,4,1), end_date = datetime.date(2015,4,30)) 

И вот одна из областей, где переменная вводится в мой SQL:

  • Как использовать схемы в Django?
  • Django: группа запросов по месяцам
  • Python не вызывает внешнюю часть программы 3
  • psycopg2 на OSX: мне тоже нужно установить PostgreSQL?
  • Совместное подключение к postgres db через процессы в Python
  • psycopg2 фактически не вставляет данные
  •  WHERE ( dv.date >= %(beg_date)s AND dv.date <= %(end_date)s) 

    Когда я запускаю это, я получаю загадочную ошибку python:

     sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) argument formats can't be mixed 

    … а затем огромный дамп оскорбительного SQL-запроса. Я запустил этот точный код с тем же самым условным условным обозначением. Почему он не работает на этот раз?

  • django-debug-toolbar не отображается
  • Pygame: Столкновение по сторонам
  • Использование Python Как читать биты в байте?
  • Доступ к элементам в заказе
  • Как получить только последнюю часть пути в Python?
  • Невозможно установить mysql-connector-python в virtualenv
  • One Solution collect form web for “Ошибка SQLAlchemy: «Форматы аргументов нельзя смешивать» при вводе переменных”

    Как оказалось, я использовал оператор SQL LIKE в новом SQL-запросе, а операнд% возился с возможностями экранирования Python. Например:

      dv.device LIKE 'iPhone%' or dv.device LIKE '%Phone' 

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

      dv.device ~ E'iPhone.*' or dv.device ~ E'.*Phone$' 

    Поэтому для других: вам может потребоваться изменить ваши LIKE-операторы на regex '~', чтобы заставить его работать. Просто помните, что это будет медленнее для больших запросов. (Больше информации здесь .)

    Python - лучший язык программирования в мире.