sqlalchemy / pg8000 выдает ошибки при параметризованных запросах - PullRequest
0 голосов
/ 07 октября 2019

Я создаю пакет, использующий sqlalchemy, позволяющий пользователю получить доступ либо к sqlite (sqlite3), либо к Postgres (pg8000) db. Есть некоторые вспомогательные функции для некоторых регулярно используемых db-запросов, но, хотя они работают для sqlite, они выдают ошибки для Postgres. Например, приведенный ниже метод извлекает список участников из таблицы. Это прекрасно работает, если таблица находится в sqlite db.

    def get_participants(self, con):
       table_name = "ext07"
       query = "SELECT * FROM " + table_name + " WHERE participant_id IS NOT 'ACA' "
       rows = con.execute(query)
       participants = pd.DataFrame(rows, columns=COLUMNS["ext07"])
       return participants

, где аргумент 'con' - это соединение, созданное sqlalchemy. Но этот метод выдает ошибку, если соединение с базой данных Postgres, где он выглядит как синтаксис запроса, например. проблема с выходом из одинарных кавычек.

<class 'tuple'>: (<class 'sqlalchemy.exc.ProgrammingError'>, ProgrammingError('(pg8000.core.ProgrammingError) {\'S\': \'ERROR\', \'V\': \'ERROR\', \'C\': \'42601\', \'M\': \'syntax error at or near "\\\'ACA\\\'"\', \'P\': \'55\', \'F\': \'scan.l\', \'L\': \'1134\', \'R\': \'scanner_yyerror\'}'), <traceback object at 0x7fa2e13c6a88>)

Я пытался изменить синтаксис строки запроса и использовать параметризованные запросы:

   def get_participants(self, con):
       table_name = "ext07"
       exclude = "ACA"
       query = "SELECT * FROM $1 WHERE 'participant_id' IS NOT $2"
       rows = con.execute(query,(table_name, exclude))
       participants = pd.DataFrame(rows, columns=COLUMNS["ext07"])
       return participants

В результате возникает аналогичная ошибка:

<class 'tuple'>: (<class 'sqlalchemy.exc.ProgrammingError'>, ProgrammingError('(pg8000.core.ProgrammingError) {\'S\': \'ERROR\', \'V\': \'ERROR\', \'C\': \'42601\', \'M\': \'syntax error at or near "$1"\', \'P\': \'15\', \'F\': \'scan.l\', \'L\': \'1134\', \'R\': \'scanner_yyerror\'}'), <traceback object at 0x7fb8a88e3088>)

Я знаю, что соединения правильные, и сообщение об ошибке на консоли указывает на то, что запрос сформирован правильно:

    sqlalchemy.exc.ProgrammingError: (pg8000.core.ProgrammingError) {'S': 'ERROR', 'V': 'ERROR', 'C': '42601', 'M': 'syntax error at or near "$1"', 'P': '15', 'F': 'scan.l', 'L': '1134', 'R': 'scanner_yyerror'}
[SQL: SELECT * FROM $1 WHERE 'participant_id' IS NOT $2]
[parameters: ('ext07', 'ACA')]

Я перешел по ссылке во фрагменте, искал похожие проблемы, например. здесь, в стеке ), и попытался понять правильный синтаксис для запроса pg8000 site alchemy site . Да, я знаю о декларативном подходе ORM, который есть у sqlalchemy, но он кажется излишним для этого простого варианта использования. Что мне не хватает в синтаксисе? Любые рекомендуемые руководства или альтернативные подходы?

...