Я создаю пакет, использующий 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, но он кажется излишним для этого простого варианта использования. Что мне не хватает в синтаксисе? Любые рекомендуемые руководства или альтернативные подходы?