У меня есть скрипт, который использует Amazon API для поиска элементов на основе UPC, а затем сохранить их в базе данных MySql.По какой-то причине, когда я использую session.merge
, он случайно вылетает из сценария.Использование session.add
работает, но при наличии дубликата в базе данных ошибки сценария при фиксации.
Кроме того, при сбое сценария он не выдает никаких ошибок.
Есть липричина, по которой session.merge вызывает сбой сценария или способ, которым session.add может обновить дубликаты записей на session.commit?
Спасибо,
Код:
upcs = <List of UPC Codes>
# Breaking the list into groups of 10 for Amazon API
group = 10
sub_upcs = [upcs[i:i+group] for i in range(0, len(upcs), group)]
for sub_upc in sub_upcs:
try:
products = amazon.lookup(ItemId=','.join(sub_upc), IdType='UPC', SearchIndex='All')
except AsinNotFound as e:
print("UPC Not Found")
except Exception as e:
print(e)
if type(products) is list:
for product in products:
am_item = Item(product)
session.merge(am_item.db_item)
else:
am_item = Item(products)
session.merge(am_item.db_item)
try:
session.commit()
print("Session Written")
except Exception as e:
print(e)
ЭлементКласс:
class AmazonItem(Base):
__tablename__ = 'amazon_products'
timestamp = Column(TIMESTAMP)
itemid = Column(String, primary_key=True, index=True, unique=True)
name = Column(String)
upc = Column(String, index=True)
msrp = Column(Float)
price = Column(Float)
brandname = Column(String)
modelnumber = Column(String)
url = Column(String)
def __init__(self, item):
self.timestamp = datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
self.itemid = item.asin
self.name = item.title
self.upc = item.upc
self.msrp = item.price_and_currency[0]
self.price = item.price_and_currency[0]
self.brandname = ""
self.modelnumber = ""
self.url = item.offer_url
class Item():
item = None
db_item = None
store = ""
itemid = ""
name = ""
upc = ""
msrp = 0
price = 0
brandname = ""
modelnumber = ""
def __init__(self, item):
self.timestamp = datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
self.item = item
self.db_item = AmazonItem(item)
self.store = "Amazon"
self.itemid = item.asin
self.name = item.title
self.upc = item.upc
self.msrp = item.price_and_currency[0]
self.price = item.price_and_currency[0]
self.brandname = ""
self.modelnumber = ""
self.url = item.offer_url
self.asin = item.asin
if self.msrp == 0 or self.msrp is None:
self.msrp = self.price
if self.price == 0 or self.price is None:
self.price = self.msrp
def __eq__(self, other):
return self.itemid == other.itemid
def __hash__(self):
return hash(('itemid', self.itemid))
def writetocsv(self, file):
csv_writer = CSVWriter(file)
csv_writer.addrow(self.getrow())
csv_writer.write()