首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大容量插入瓶-SQLAlchemy

大容量插入瓶-SQLAlchemy
EN

Stack Overflow用户
提问于 2015-05-19 04:43:30
回答 3查看 10.3K关注 0票数 13

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

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

目前,我正在对每个insert执行一个db.session.add()db.session.commit(),并且每秒得到一个微不足道的3-4个插入。

我运行了一个分析器来查看瓶颈所在,而且db.session.commit()占用了60%的时间。

是否有什么方法可以让这个操作更快,也许通过分组提交,但是哪种方式会让我返回主键呢?

我的模特就是这样的:

代码语言:javascript
复制
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))

我的插入操作是:

代码语言:javascript
复制
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()
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-19 09:31:09

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

票数 6
EN

Stack Overflow用户

发布于 2017-01-19 11:46:56

我使用下面的代码快速地将熊猫DataFrame的内容读入SQLite。注意,它绕过了SQLAlchemy的ORM特性。此上下文中的myClass是一个db.Model派生类,其表名分配给它。正如代码片段所提到的,我调整了

代码语言:javascript
复制
l = df.to_dict('records')
# bulk save the dictionaries, circumventing the slow ORM interface
# c.f. https://gist.github.com/shrayasr/5df96d5bc287f3a2faa4
connection.engine.execute(
    myClass.__table__.insert(),
    l
)
票数 6
EN

Stack Overflow用户

发布于 2022-09-06 16:04:03

代码语言:javascript
复制
from app import db

data = [{"attribute": "value"}, {...}, {...}, ... ]
db.engine.execute(YourModel.__table__.insert(), data)

有关更多信息,请参阅https://gist.github.com/shrayasr/5df96d5bc287f3a2faa4

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30316913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档