我编写了一个Flask应用程序,它从JSON api中提取计算机列表并将它们存储在数据库中。一旦存储它们,脚本就会失败,因为它试图将相同的计算机写入数据库,但我将serial_number unique设置为True。这是数据库结构和功能。
错误:重复键值违反了唯一约束
class Computer(db.Model):
id = db.Column(db.Integer, primary_key=True)
serial_number = db.Column(db.String(80), unique=True)
group = db.Column(db.String(80))
notes = db.Column(db.Text, nullable=True)
def __init__(self, serial_number, group, notes):
self.serial_number = serial_number
self.group = group
self.notes = notes
def __repr__(self):
return '<Computer %r>' % self.serial_number
def save_comps():
comps = r.json()
for comp in comps:
serial = str(comp['serial_number'])
group = str(comp['group'])
notes = None
if comp['serial_number'] != serial:
c = Computer(serial, group, notes)
db.session.add(c)
db.session.commit()
一如既往,先谢谢你。
答案 0 :(得分:0)
Would this do the trick?
from sqlalchemy.exc import IntegrityError
if comp['serial_number'] != serial:
c = Computer(serial, group, notes)
db.session.add(c)
try:
db.session.commit()
except IntegrityError:
# handle error here
I usually manage integrity errors this way. If this isn't the logic you want, you might want to reconsider your db design, e.g. update a flag in the model, rather than add the serial number.
For example:
class Computer(db.Model):
id = db.Column(db.Integer, primary_key=True)
serial_number = db.Column(db.String(80), unique=True)
group = db.Column(db.String(80))
notes = db.Column(db.Text, nullable=True)
last_registered = db.Column(db.DateTime,default=datetime.datetime.utcnow)