使用sqlalchemy orm大容量插入多个表

ryevplcw  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(365)

我试图做一个大批量插入到2个表使用 flask sqlalchemy。这两个表是:
作者表:pk author\u id(自动递增)
书表:pk book\u id(ai),fk author\u author\u id
在json的主体中,我有一个字典列表。每个词典条目都有一些与作者相关的信息和一些与书籍相关的信息。类似于这样,可以一次性发送更多的词典:

[
    {
        "author_first_name": "John",
        "author_last_name": "Doe",
        "author_yob": "1988",
        "book_name": "Mournings of a nun",
        "book_genre": "Drama"
    },
    {
        "author_first_name": "Jane",
        "author_last_name": "Doe",
        "author_yob": "1987",
        "book_name": "Need for speed",
        "book_genre": "Action"
    }
]

目前,我正在遍历每个字典,将数据插入author表,然后插入book表。当我插入author表并提交时,我得到了一个主键,即author\ id,这是我的book表的外键。
我对列表中的每个条目重复此步骤。有没有一种方法可以进行批量插入,这样如果任何插入失败,所有内容都会回滚,并且我的数据库中没有不一致的数据?因此,如果上面的json中有15个字典,如果第12个字典有一些无效数据或者数据库崩溃,我希望json中发送的数据都不应该发布到awsrds。下面,“results”指的是我上面提到的json。

@classmethod
    def post_to_database(cls, results):
        for result in results:
            BookModel.post_entry_to_database(result)

    @classmethod
    def post_entry_to_database(cls, result):
        BookModel.insert_author_entry(result)
        author_id = BookModel.get_author_id(result)
        BookModel.insert_book_entry(author_id, result)

    @classmethod
    def insert_book_entry(cls, author_id, result):
        book_data = BookModel(result["testname"], result["result"], author_id)
        db.session.add(book_data)
        db.session.commit()

同样,我也插入了作者条目。
谢谢,再见

eeq64g8w

eeq64g8w1#

你可以考虑使用 flush() 刷新对数据库的更改,这将更新主键字段。
来自sqlalchemy文档:flush
数据库操作将在当前事务上下文中发出,并且不会影响事务的状态,除非发生错误,在这种情况下,将回滚整个事务。您可以在事务中随时刷新()以将更改从python移动到数据库的事务缓冲区。
打电话的时候 flush ,数据库将crud操作保持为事务中的挂起操作,并且在数据库收到 COMMIT 对于当前事务。这将在您随后致电时发生 commit() .

相关问题