Python 使用SqlAlchemy执行原始查询(在SQL Server数据库和Pymssql上)时,传递无法识别的参数并引发SQL错误
我尝试在SQL Server db上执行简单的原始SQL查询,并使用SqlAlchemy和PymSQL作为提供程序 这是我第一次尝试使用连接的execute方法,并以**kwargs方式传递参数:Python 使用SqlAlchemy执行原始查询(在SQL Server数据库和Pymssql上)时,传递无法识别的参数并引发SQL错误,python,sql-server,sqlalchemy,pymssql,parameterized-query,Python,Sql Server,Sqlalchemy,Pymssql,Parameterized Query,我尝试在SQL Server db上执行简单的原始SQL查询,并使用SqlAlchemy和PymSQL作为提供程序 这是我第一次尝试使用连接的execute方法,并以**kwargs方式传递参数: provider = DataProvider().engine q = "select url from Crawler.CrawlSource where source=@source" query = text(q) result = provider.connect().execute(que
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, source ='mysource')
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, source ='mysource')
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')
我以教程中所示的任何方式传递参数,如kwargs传递和dict传递,但这两种方式都不起作用,当调用execute方法时,会抛出一个异常,表示“必须声明标量变量”@source,就好像没有参数传递给execute方法一样,在这种情况下,ORM或数据提供程序pymssql似乎不识别传递给execute方法的参数,而只将不带参数的查询传递给db引擎,从而导致异常
我猜MSSQL服务器提供程序Pymssql可能存在一些问题,因为SQL Server不是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'})
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, {source :'mysource'})
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'})
我第三次尝试使用engine对象的execute方法并以**kwargs方式传递参数:
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, source ='mysource')
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, source ='mysource')
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')
我的第四次尝试使用engine对象的execute方法并按dict传递参数:
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, {source :'mysource'})
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, {source :'mysource'})
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方法,并将参数作为dict传递:
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, {source :'mysource'})
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, {source :'mysource'})
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
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, source ='mysource')
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, source ='mysource')
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')
但正如我前面提到的,所有这些努力都没有奏效,都导致了上述同样的例外
任何帮助都将不胜感激mssql+pymssql方言似乎支持pyformat。这对我很有用: 将sqlalchemy作为sa导入 engine=sa.create_enginemssql+pymssql://@localhost:49242/myDb sql=从语言=%langs的词汇表中选择单词 params={'lang':'Greek'} 使用发动机。以连接方式开始: 结果=conn.executesql,params.fetchall 打印结果 ['γιορτή',, 'ηλεκτρονικός υπολογιστής',] 如果使用SQLAlchemy文本对象,也可以使用命名的paramstyle: sql=sa.sql.text从语言=:lang的词汇表中选择单词 params={'lang':'Greek'} 使用发动机。以连接方式开始: 结果=conn.executesql,params.fetchall 打印结果 ['γιορτή',, 'ηλεκτρονικός υπολογιστής',]
text对象允许我们一致使用命名的paramstyle,而不考虑DB-API层支持的本机paramstyle,例如,pymssql的%s?用于pyodbc。尝试使用。。。其中source=:source@GordThompson的可能副本尝试了,“:”不适用于在sql server中传递参数它适用于Postgress Ithink@GordThompson它不是复制品。您发送的帖子不是针对SQL Server的。如果你读对了这个问题,我还提到我将参数作为字典传递,但效果不好。我猜SQL Server兼容性有点问题,因为它在以dictNo形式传递参数时适用于其他数据库:例如,命名参数的样式在cx_Oracle驱动程序上本机工作,但SQLAlchemy文本将命名样式转换为驱动程序使用的样式。此外,Session.execute处理文本查询就像自动用文本包装一样。非常感谢,第二个选项对我很有用!