Я реализую класс онтологии Python, который использует базу данных для хранения и запроса онтологии.Схема базы данных исправлена (указана заранее), но я не знаю, какой тип ядра базы данных используется.Однако я могу положиться на тот факт, что интерфейс Python ядра СУБД использует Python DB-API 2.0 ( PEP 249 ).Простая идея состоит в том, чтобы позволить пользователю передать PEP 249-совместимый объект Connection
в конструктор моей онтологии, который затем будет использовать различные жестко закодированные SQL-запросы для запросов к базе данных:
class Ontology(object):
def __init__(self, connection):
self.connection = connection
def get_term(self, term_id):
cursor = self.connection.cursor()
query = "SELECT * FROM term WHERE id = %s"
cursor.execute(query, (term_id, ))
[...]
Моя проблемачто разные бэкэнды базы данных могут поддерживать разные маркеры параметров в запросах, определенных атрибутом paramstyle
бэкэнд-модуля.Например, если paramstyle = 'qmark'
, интерфейс поддерживает стиль знака вопроса (SELECT * FROM term WHERE id = ?
);paramstyle = 'numeric'
означает числовой позиционный стиль (SELECT * FROM term WHERE id = :1
);paramstyle = 'format'
означает стиль строки формата ANSI C (SELECT * FROM term WHERE id = %s
).Если я хочу, чтобы мой класс мог обрабатывать разные базы данных, похоже, мне нужно подготовиться ко всем стилям маркеров параметров.Похоже, это лишает меня смысла использования общего API БД, поскольку я не могу использовать один и тот же параметризованный запрос с разными бэкэндами базы данных.
Есть ли способ обойти это, и если да, то какой из них лучше?подход?API БД не указывает на существование универсальной функции экранирования, с помощью которой я могу дезинфицировать свои значения в запросе, поэтому экранирование вручную не вариант.Я не хочу добавлять дополнительную зависимость в проект, используя еще более высокий уровень абстракции (например, SQLAlchemy).