如何通过executemany(Python)在查询中多次使用元组中的值

时间:2019-05-16 14:39:19

标签: python mysql sql

我有一些python代码,可从一个数据库(SQL服务器)获取数据并将其插入到另一个数据库(MySQL)中。我正在尝试向INSERT查询中添加WHERE NOT EXIST,以便仅插入新行,但是第二次需要使用元组SageResults中的值之一作为主键。

代码:

import mysql.connector
import pyodbc

def insert_VPS(SageResult):
    query = """
INSERT INTO SOPOrderReturn(SOPOrderReturnID, DocumentTypeID, DocumentNo, DocumentDate, CustomerID, CustomerTypeID, CurrencyID, SubtotalGoodsValue, TotalNetValue, TotalTaxValue, TotalGrossValue, SourceTypeID, SourceDocumentNo)
VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
WHERE NOT EXISTS (SELECT * FROM SOPOrderReturn WHERE SOPOrderReturnID = %1$s)"""
    try:
        mydbVPS = mysql.connector.connect(
          host="address",
          user="user",
          passwd="password",
          database="database"
        )

        VPScursor = mydbVPS.cursor()
        #print(SageResult)
        VPScursor.executemany(query, SageResult)


        mydbVPS.commit()
    except Exception as e:
        print('InsertError:', e)

    finally:
        VPScursor.close()
        mydbVPS.close()

def main():
    selectQuery = """
SELECT TOP 51 [SOPOrderReturnID]
      ,[DocumentTypeID]
      ,[DocumentNo]
      ,[DocumentDate]
      ,[CustomerID]
      ,[CustomerTypeID]
      ,[CurrencyID]
      ,[SubtotalGoodsValue]
      ,[TotalNetValue]
      ,[TotalTaxValue]
      ,[TotalGrossValue]
      ,[SourceTypeID]
      ,[SourceDocumentNo]
  FROM [Live].[dbo].[SOPOrderReturn]
"""


    try:
        mydbSage = pyodbc.connect('Driver={SQL Server};'
                      'Server=CRMTEST;'
                      'Database=Live;'
                      'UID=sa;'
                      'PWD=password;')

        Sagecursor = mydbSage.cursor()

        Sagecursor.execute(selectQuery)
        #SageResult = tuple(Sagecursor.fetchall())

        SageResult = []
        while True:
            row = Sagecursor.fetchone()
            if row:
                SageResult.append(tuple(row))
            else:
                break
        #SageResult = Sagecursor.fetchall()

        mydbSage.commit()
    except Exception as e:
        print('MainError:', e)

    finally:
        Sagecursor.close()
        mydbSage.close()

    insert_VPS(SageResult)


if __name__ == '__main__':
    main()

输出:

D:\xampp\htdocs\stripe\group\beta>sql-sync.py
InsertError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use ne
ar 'WHERE NOT EXISTS (SELECT * FROM SOPOrderReturn WHERE SOPOrderReturnID = %1$s),(1' at line 3

有问题的部分是query字符串变量。这里的其他一切都很好。我基本上需要第二次使用元组中的SOPOrderReturnID值,而我当前拥有%1$s

查询语法有什么问题?我对%1$s的使用正确吗?

0 个答案:

没有答案