python - 使用 Flask-SQLAlchemy 批量插入

标签 python flask sqlalchemy flask-sqlalchemy

我正在使用 Flask-SQLAlchemy 执行相当大的 60k 行批量插入。我在这个表上也有一个多对多的关系,所以我不能为此使用 db.engine.execute。在插入之前,我需要在数据库中找到类似的项目,如果发现重复的项目,则将插入更改为更新。

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

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

我运行了一个分析器来查看瓶颈在哪里,似乎 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()

最佳答案

也许您应该尝试使用 db.session.flush() 将数据发送到服务器,这意味着将生成任何主键。最后,您可以 db.session.commit() 实际提交事务。

关于python - 使用 Flask-SQLAlchemy 批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30316913/

相关文章:

python - 如何使用 Python/flask 将 Twitter 元数据从服务器流式传输到客户端浏览器

python - 确保 SQLAlchemy 不会重复使用数字 ID

python - 使用 SQL Alchemy 查询 Kerberized Hive

Python - 从另一个列表中删除一组列表

PYTHON DLL 加载失败

python - WTForms FormField 导致 csrf_token 错误

python - 带池的 SQLAlchemy 不关闭数据库连接

python - 在Python中将字典转换为以键作为对象名称的对象

python - Jinja2 将 layout 的头部 + 不需要的 break 放入 child 的 body

python - Flask 和 Flask-SocketIO 集成和导入错误