Передача параметров не распознается и выдает ошибку SQL при выполнении необработанного запроса (к базе данных SQL-Server и Pymssql) с помощью SqlAlchemy - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь выполнить простой необработанный запрос SQL на базе данных SQL-Server с помощью SqlAlchemy (и Pymssql в качестве поставщика).

Вот моя первая попытка (с использованием execute метода подключения и передачи параметров ** путем kwargs):

provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, source ='mysource')

Я передал параметры любым способом, показанным в руководствах (передачакак kwargs и передавая как dict), но ни один из них не сработал, и когда вызывается метод execute, выдается исключение, которое говорит 'Must declare the scalar variable' @source, как будто ни один параметр не передается в метод execute, кажется, ORM(или, возможно, поставщик данных (в данном случае pymssql)) не распознает параметры, переданные методу execute, и передает только запрос (без параметров) в механизм БД (что вызывает исключение).

Я полагаю, что тамможет быть некоторая проблема с поставщиком MSSQL-сервера (Pymssql), поскольку SQL-сервер не является гражданином первого класса в семействе SqlAlchemy и Python, но не имеет прямого представления о том, что может вызвать это.

, как я уже говорил выше, я также пыталсяа также другие способы

Вот моя вторая попытка (с использованием execute метода соединения и передачи параметров в качестве dict):

provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, {source :'mysource'})

Моя третья попытка (с использованием execute mметод объекта двигателя и параметры передачи ** способом kwargs):

provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, source ='mysource')

Моя четвертая попытка (с использованием метода объекта двигателя 1010 * и передачей параметров как dict):

provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, {source :'mysource'})

Моя пятая попытка (создание сеанса и использование execute метода сеанса и передача параметров в качестве dict):

provider = DataProvider().engine
session = sessionmaker(bind=provider)()
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = session.execute(query, {source :'mysource'})

Моя шестая попытка (создание сеанса и использование execute метода сеанса и передача параметров** kwargs):

provider = DataProvider().engine
session = sessionmaker(bind=provider)()
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = session.execute(query,  source='mysource')

, но, как я уже упоминал ранее, ни одно из вышеперечисленных действий не сработало, и все они привели к тому же исключению, упомянутому выше

Любая помощь будет оценена*

1 Ответ

2 голосов
/ 20 октября 2019

Кажется, что диалект mssql + pymssql поддерживает "pyformat" paramstyle . Это работает для меня:

import sqlalchemy as sa

engine = sa.create_engine("mssql+pymssql://@localhost:49242/myDb")

sql = "SELECT word FROM vocabulary WHERE language = %(lang)s"
params = {'lang': 'Greek'}
result = engine.execute(sql, params).fetchall()
print(result)
# [('γιορτή',), ('ηλεκτρονικός υπολογιστής',)]

Мы также можем использовать «именованный» paramstyle, если мы используем объект SQLAlchemy text:

sql = sa.sql.text("SELECT word FROM vocabulary WHERE language = :lang")
params = {'lang': 'Greek'}
result = engine.execute(sql, params).fetchall()
print(result)
# [('γιορτή',), ('ηλεκτρονικός υπολογιστής',)]

Объект text позволяет нампоследовательно используйте «именованный» стиль парастиля независимо от собственного стиля, поддерживаемого уровнем DB-API (например, %s для pymssql, ? для pyodbc).

...