带Flask的大容量嵌件

2024-04-25 05:17:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Flask SQLAlchemy做了一个相当大的60k行的大容量插入。我在这个表上还有一个多对多关系,因此不能使用db.engine.execute来实现这个功能。在插入之前,我需要在数据库中找到类似的项,如果找到重复项,则将插入更改为更新。

我可以事先检查,然后通过db.engine.execute进行大容量插入,但插入时需要行的主键。

目前,我正在对每个插入进行db.session.add()db.session.commit(),每秒只能得到3-4个插入。

我运行了一个profiler来查看瓶颈在哪里,看起来db.session.commit()占用了60%的时间。

是否有某种方法可以让我更快地执行此操作,可能是通过对提交进行分组,但哪种方法可以返回主键?

我的模特就是这样的:

class Item(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(1024), nullable=True)
    created = db.Column(db.DateTime())
    tags_relationship = db.relationship('Tag', secondary=tags, backref=db.backref('items', lazy='dynamic'))
    tags = association_proxy('tags_relationship', 'text')

class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
text = db.Column(db.String(255))

我的插入操作如下运行:

for item in items:
    if duplicate:
        update_existing_item
    else:
        x = Item()
        x.title = "string"
        x.created = datetime.datetime.utcnow()
        for tag in tags:
            if not tag_already_exists:
                y = Tag()
                y.text = "tagtext"
                x.tags_relationship.append(y)
                db.session.add(y)
                db.session.commit()
            else:
                x.tags_relationship.append(existing_tag)
    db.session.add(x)
    db.session.commit()

Tags: textaddtrueexecutedbsessiontagtags