在python中使用pyodbc时,Try-and-Catch异常未按预期工作
目标: 编写一个脚本,逐行读取文件,然后将其插入数据库。如果插入失败,应将该行写入日志文件 要解决的问题: 如果无法插入该行,则表明我的打印语句有效,即“无法插入产品表”,但未插入的行应写入名为log.txt的文本文件。似乎只插入了其中一行,其他行都没有写入日志文件 有人能建议我的try/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
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”
。谢谢。这解决了问题