Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用pyodbc时,Try-and-Catch异常未按预期工作_Python_Try Catch - Fatal编程技术网

在python中使用pyodbc时,Try-and-Catch异常未按预期工作

在python中使用pyodbc时,Try-and-Catch异常未按预期工作,python,try-catch,Python,Try Catch,目标: 编写一个脚本,逐行读取文件,然后将其插入数据库。如果插入失败,应将该行写入日志文件 要解决的问题: 如果无法插入该行,则表明我的打印语句有效,即“无法插入产品表”,但未插入的行应写入名为log.txt的文本文件。似乎只插入了其中一行,其他行都没有写入日志文件 有人能建议我的try/catch异常有什么问题吗?它应该将所有未插入的行写入日志文件 import threading import queue import pyodbc import re import datetime #C

目标: 编写一个脚本,逐行读取文件,然后将其插入数据库。如果插入失败,应将该行写入日志文件

要解决的问题: 如果无法插入该行,则表明我的打印语句有效,即“无法插入产品表”,但未插入的行应写入名为log.txt的文本文件。似乎只插入了其中一行,其他行都没有写入日志文件

有人能建议我的try/catch异常有什么问题吗?它应该将所有未插入的行写入日志文件

import threading
import queue
import pyodbc
import re
import datetime

#Configure the number of threads
n_thread = 5
#Create the queue needed to manage threads
queue = queue.Queue()

db = pyodbc.connect('Driver={SQL Server};'
                      'Server=R-USLA-01006;'
                      'Database=C49_GAP_Reference;'
                      'Trusted_Connection=yes;')


cursor = db.cursor()


class ThreadClass(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
    #Assign thread working with queue
        self.queue = queue

    def run(self):
        while True:
            host = self.queue.get()  #Get from queue job
            print (self.getName() + ":" + host)
            #signals to queue when the task is finished
            self.queue.task_done()

    #Create numbered process such that each thread can read a line
for i in range(n_thread):
    t = ThreadClass(queue)
    t.setDaemon(True)
    #Start thread
    t.start()

hostfile = open("C:\\Users\\rparpani\Desktop\\Powershell\\GAP\\product_dump.txt", encoding='utf-8')
for line in hostfile:
    #Put line to queue
    # print(line)
    values = line.split("\t")
    print(values)

    datetime_object1 = values[17]
    datetime_object2 = values[18]
    datetime_object3 = values[19]

    try:
        x = datetime.datetime.strptime(datetime_object1, '%Y-%m-%d %H:%M:%S.%f')

    except:
        x = datetime.datetime.strptime(datetime_object1, '%Y-%m-%d %H:%M:%S')
    
    print(x)

    try:
        y = datetime.datetime.strptime(datetime_object2, '%Y-%m-%d %H:%M:%S.%f')

    except:
        y = datetime.datetime.strptime(datetime_object2, '%Y-%m-%d %H:%M:%S')
    
    print(y)

    try:
        z = datetime.datetime.strptime(datetime_object3, '%Y-%m-%d %H:%M:%S.%f')

    except:
        z = datetime.datetime.strptime(datetime_object3, '%Y-%m-%d %H:%M:%S')
    
    print(z)
    
    

    QuantityPerOrderUnit = values[21]
    
    try:
        variable = int(QuantityPerOrderUnit)
    except:
        variable = -1

    print(variable) 

    #1.Add a try and catch exception while you insert. Anything not inserted will go into a log file 
    # query = ("INSERT INTO product.ARDMProductTestDump(ArticleID, ProductHierarchy1, ProductHierarchy1Description,ProductHierarchy2) VALUES(" + values[0] + ','  + values[1] + ',' + values[2] + ',' + values[3] + ")")
    # query = ("INSERT INTO product.ARDMProductTestDump(ArticleID, ProductHierarchy1, ProductHierarchy1Description,ProductHierarchy2)" "VALUES(?, ?, ?, ?)")


    #query = ("INSERT INTO product.ARDMProductTestDump(ArticleID, ProductHierarchy1, ProductHierarchy1Description,ProductHierarchy2, ProductHierarchy2Description,ProductHierarchy3, ProductHierarchy3Description,ProductHierarchy4, ProductHierarchy4Description,ProductHierarchy5, ProductHierarchy5Description,ProductHierarchy6, ProductHierarchy6Description, ProductName,ProductDescription,ReceiptDescription,AlternateSKU,ReleaseDate,InsertedDateTime,UpdatedDateTime,OrderUnitID,QuantityPerOrderUnit, VendorProductID, VendorID, VendorName, ImageURL)" "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")
    try:
        query = ("INSERT INTO product.ARDMProductTestDump(ArticleID, ProductHierarchy1, ProductHierarchy1Description,ProductHierarchy2, ProductHierarchy2Description,ProductHierarchy3, ProductHierarchy3Description,ProductHierarchy4, ProductHierarchy4Description,ProductHierarchy5, ProductHierarchy5Description,ProductHierarchy6, ProductHierarchy6Description, ProductName,ProductDescription,ReceiptDescription,AlternateSKU,ReleaseDate,InsertedDateTime,UpdatedDateTime,OrderUnitID,QuantityPerOrderUnit, VendorProductID, VendorID, VendorName, ImageURL)" "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")
        cursor.execute(query, values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8], values[9], values[10], values[11], values[12], values[13], values[14], values[15], values[16], x, y, z, values[20], variable, values[22], values[23], values[24], values[25])
        print(query)
        db.commit()

    except pyodbc.Error as e:
        print("Failed to insert record into the product table")
        with open("Log.txt", "w") as text_file:
            text_file.write(line)
            
        
    # print(query)
    queue.put(line)

   
    
    # cursor.execute(query, values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8], values[9], values[10], values[11], values[12], values[13], values[14], values[15], values[16], x, y, z, values[20], variable, values[22], values[23], values[24], values[25])

    # db.commit()
    #wait on the queue until everything has been processed
    queue.join()

cursor.close()

每次出现异常时,您都以写模式打开日志文件。这意味着您从文件的开头开始写入,覆盖以前写入的任何内容


您应该改为以追加模式打开,以便在文件末尾开始写入。在您的
open()
通话中将
“w”
更改为
“a”

谢谢。这解决了问题