Как я могу использовать значение в кортеже более одного раза в запросе с executemany (Python) - PullRequest
0 голосов
/ 16 мая 2019

У меня есть некоторый код Python, который получает данные из одной базы данных (сервер SQL) и вставляет их в другую базу данных (MySQL).Я пытаюсь добавить WHERE NOT EXIST в запрос INSERT, чтобы вставить только новые строки, но мне нужно использовать одно из значений в кортеже 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...