如何跳过Postgres DB中的唯一值

时间:2015-12-14 00:03:30

标签: python postgresql flask

我编写了一个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()

一如既往,先谢谢你。

1 个答案:

答案 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)