我试图做一个大批量插入到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()
同样,我也插入了作者条目。
谢谢,再见
1条答案
按热度按时间64jmpszr1#
你可以考虑使用
flush()
刷新对数据库的更改,这将更新主键字段。来自sqlalchemy文档:flush
数据库操作将在当前事务上下文中发出,并且不会影响事务的状态,除非发生错误,在这种情况下,将回滚整个事务。您可以在事务中随时刷新()以将更改从python移动到数据库的事务缓冲区。
打电话的时候
flush
,数据库将crud操作保持为事务中的挂起操作,并且在数据库收到COMMIT
对于当前事务。这将在您随后致电时发生commit()
.