我正在尝试使用pyodbc更新sql server中的表,但我无法获得正确的语法。 代码段 -
def fun(cur,tablename):
cur.execute("""UPDATE sam
SET
sam.agreement_id = ?
FROM '{0}' sam
INNER JOIN dbo.agreement_mapping am ON sam.agreement_id = ?;
""".format(tablename.replace('\'', '\'\'')),am.newagreementid,am.oldagreementid)
我收到错误`" name' am'未定义"。 有什么方法可以执行此更新查询吗?
答案 0 :(得分:1)
为了清晰起见,重构代码
def fun(cur,tablename):
cur.execute("""UPDATE sam
SET
sam.agreement_id = ?
FROM '{0}' sam
INNER JOIN dbo.agreement_mapping am ON sam.agreement_id = ?;
""".format(tablename.replace('\'', '\'\'')),am.newagreementid,am.oldagreementid)
变为
def fun(cur,tablename):
stmt = """\
UPDATE sam
SET
sam.agreement_id = ?
FROM '{0}' sam
INNER JOIN dbo.agreement_mapping am ON sam.agreement_id = ?;
""".format(tablename.replace('\'', '\'\''))
cur.execute(stmt, am.newagreementid, am.oldagreementid)
有两个问题:
首先,'{0}'
将表名包装在单引号中,将其转换为字符串文字。 SQL Server表名用方括号分隔。
其次,am.newagreementid
调用中的am.oldagreementid
和execute
引用在Python中进行评估。您的Python代码不会声明任何名为am
的Python变量或对象,因此这些引用无效。
相反,你需要做这样的事情:
def fun(cur,tablename):
stmt = """\
UPDATE sam
SET
sam.agreement_id = am.newagreementid
FROM [{0}] sam
INNER JOIN dbo.agreement_mapping am ON sam.agreement_id = am.oldagreementid;
""".format(tablename.replace('\'', '\'\''))
cur.execute(stmt)