Метод exec_driver_sql
Метод exec_driver_sql класса Connection
выполняет SQL-запрос напрямую через драйвер базы
данных. В отличие от метода execute, который
принимает конструкции SQLAlchemy и компилирует их
в диалект конкретной СУБД, метод exec_driver_sql
передаёт строку запроса драйверу как есть.
Первым параметром метод принимает строку SQL или
объект, поддерживаемый драйвером. Вторым
необязательным параметром передаётся словарь или
кортеж параметров для подстановки в запрос.
Метод возвращает объект CursorResult с
результатами выполнения.
Синтаксис
Connection.exec_driver_sql(statement, parameters=None, execution_options=None)
Пример
Давайте выполним простой SQL-запрос через
exec_driver_sql и выведем результат:
from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
res = conn.exec_driver_sql('SELECT 1 AS num')
print(res.fetchall())
Результат выполнения кода:
[(1,)]
Пример
Давайте создадим таблицу и вставим данные, используя позиционные параметры драйвера:
from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.exec_driver_sql(
'CREATE TABLE articles ('
'id INTEGER PRIMARY KEY, '
'title VARCHAR, '
'status VARCHAR)'
)
conn.exec_driver_sql(
'INSERT INTO articles (title, status) VALUES (?, ?)',
('article', 'draft')
)
res = conn.exec_driver_sql(
'SELECT id, title, status FROM articles'
)
print(res.fetchall())
Результат выполнения кода:
[(1, 'article', 'draft')]
Пример
Давайте передадим параметры в именованном стиле через словарь:
from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.exec_driver_sql(
'CREATE TABLE articles ('
'id INTEGER PRIMARY KEY, '
'title VARCHAR, '
'num INTEGER)'
)
conn.exec_driver_sql(
'INSERT INTO articles (title, num) VALUES (:title, :num)',
{'title': 'article', 'num': 10}
)
res = conn.exec_driver_sql(
'SELECT title, num FROM articles WHERE num > :min_num',
{'min_num': 5}
)
print(res.fetchall())
Результат выполнения кода:
[('article', 10)]
Пример
Давайте выполним запрос с текстом, содержащим спецсимволы, и передадим его драйверу без обработки компилятором SQLAlchemy:
from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.exec_driver_sql(
'CREATE TABLE articles ('
'id INTEGER PRIMARY KEY, '
'text VARCHAR)'
)
conn.exec_driver_sql(
"INSERT INTO articles (text) VALUES ('100% sql')"
)
res = conn.exec_driver_sql(
"SELECT text FROM articles WHERE text LIKE '%100%'"
)
print(res.fetchall())
Результат выполнения кода:
[('100% sql',)]
Смотрите также
-
метод
execute,
который выполняет конструкции SQLAlchemy с компиляцией -
класс
Connection,
который представляет соединение с базой данных -
метод
scalar,
который возвращает первое значение результата -
метод
commit,
который фиксирует текущую транзакцию