flask web 开发这本书,源码改为 mysql 数据库,发现伪造数据不成功,有 rollback,但是还是不行

2018-03-15 21:37:06 +08:00
 sevenQu

flask web 开发的新版是用的 fake 来伪造数据,使用 sqlite 的时候是可以的
部署到 heroku 的 Postgres 时候也还成,有错误提示,但是还是成功输入写入了,我去 heroku 网站看数据库文档,发现免费的不支持回滚,我以为是因为这个,但数据伪造成功,我也就没管什么

现在我把同样的代码,部署到 Ubuntu 本地的 mysql,发现提示错误,数据也没有伪造成功 这是错误提示,下面代码已经有错误进行回滚了,不知道为什么还会这样,希望有人可以告知

应该不是因为数据太多吧,才 50 个

This Session's transaction has been rolled back due to a previous exception during flush. 
To begin a new transaction with this Session, first issue Session.rollback().

伪造数据的代码

def users(count=50):
    fake = Faker('zh_CN')
    i = 0
    while i < count:
        u = User(email=fake.email(),
                 username=fake.user_name(),
                 password='password',
                 confirmed=True,
                 name=fake.name(),
                 location=fake.city(),
                 about_me=fake.text(),
                 member_since=fake.past_date())
        db.session.add(u)
        try:
            db.session.commit()
            i += 1
        except IntegrityError:
            db.session.rollback()
2576 次点击
所在节点    Flask
7 条回复
linnchord
2018-03-15 22:01:10 +08:00
* except IntegrityError 有别的错就不会 rollback
* db.session.commit() 可以放到循环外
sevenQu
2018-03-15 22:25:26 +08:00
@linnchord 放到循环外面?那怎么 try 和 except 判断,这样吗?感觉有点怪

while i < count:
u = User(email=fake.email(),
username=fake.user_name(),
password='password',
confirmed=True,
name=fake.name(),
location=fake.city(),
about_me=fake.text(),
member_since=fake.past_date())
db.session.add(u)
i+=1
try:
db.session.commit()
except IntegrityError:
db.session.rollback()
sevenQu
2018-03-15 22:26:49 +08:00
@linnchord 我去,格式乱了,你的意思是 try,except 和 while 放到同一级吗?一直 add,到最后再一次性 commit,这样好吗?
ylcc
2018-03-16 00:42:45 +08:00
为什么只抓 IntegrityError,另外才 50 条,一次性 commit 没有问题。
sevenQu
2018-03-16 09:23:31 +08:00
@ylcc 你的意思是,直接 except ?出现问题都会滚?
ylcc
2018-03-16 09:37:46 +08:00
这个 db 用了 orm 么,如果是用了 sqlalchemy,可以 from sqlalchemy.exc import SQLAlchemyError, 捕捉 SQLAlchemyError
ilumer
2018-03-16 15:56:51 +08:00
把 add 放到 try 里,如果你的 sqlalchemy 中的配置没有把 auto flush 改成 False 那么你在 add 的过程中会出现自动的 commit(不够准确)。这个你可以把 echo 设置为 True 应该就可以发现了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/438471

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX