Sqlalchemy - 当数据存在关系时,如何正确地将数据批量插入数据库

时间:2016-05-26 23:07:53

标签: flask sqlalchemy flask-sqlalchemy

我有一系列事物的数据文件。每件东西都有一个基因列在其中。它是一个多关系,因为每个基因都可以是多个事物的一部分,但每个事物只能有一个基因。

想象一下大致相似的模型:

class Gene(db.Model):

    __tablename__ = "gene"

    id          = db.Column(db.Integer, primary_key=True)

    name1   = db.Column(db.Integer, index=True, unique=True, nullable=False)  # nullable might be not right
    name2   = db.Column(db.String(120), index=True, unique=True)

    things = db.relationship("Thing", back_populates='gene')

    def __init__(self, name1, name2=None):
        self.name1 = name1
        self.name2 = name2

    @classmethod
    def find_or_create(cls, name1, name2=None):
        record = cls.query.filter_by(name1=name1).first()
        if record != None:
            if record.name2 == None and name2 != None:
                record.name2 = name2
        else:
            record = cls(name1, name2)
            db.session.add(record)
        return record


class Thing(db.Model):

    __tablename__ = "thing"

    id          = db.Column(db.Integer, primary_key=True)

    gene_id     = db.Column(db.Integer, db.ForeignKey("gene.id"), nullable=False, index=True)
    gene        = db.relationship("Gene", back_populates='thing')

    data    = db.Column(db.Integer)

我想批量插入很多东西,但我担心使用

    db.engine.execute(Thing.__table__.insert(), things)

我在数据库中没有关系。是否有某种方法可以保留与批量添加的关系,或以某种方式顺序添加这些关系,然后在以后建立关系?所有the documentation about bulk adding似乎都假设您要插入非常简单的模型,而且当您的模型更复杂时(例如上面的示例是一个愚蠢的版本),我对如何执行此操作有点遗失。

- 更新1 -

This answer似乎表明目前还没有解决方案。

This answer似乎证实了这一点。

1 个答案:

答案 0 :(得分:1)

我实际上改变了我的代码,我认为它已经改进了,我也在改变我的答案。

我定义了以下2个表。集合和数据,对于集合中的每个集合,数据中有许多数据。

spring.datasource.hikari.initialization-fail-timeout=-1

然后,我将此函数写入bulk_insert数据与关系。

initializationFailTimeout

无论如何,可能还有其他更好的解决方案。