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()
![]() | 1 linnchord 2018-03-15 22:01:10 +08:00 * except IntegrityError 有别的错就不会 rollback * db.session.commit() 可以放到循环外 |
2 sevenQu OP @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() |
3 sevenQu OP @linnchord 我去,格式乱了,你的意思是 try,except 和 while 放到同一级吗?一直 add,到最后再一次性 commit,这样好吗? |
![]() | 4 ylcc 2018-03-16 00:42:45 +08:00 为什么只抓 IntegrityError,另外才 50 条,一次性 commit 没有问题。 |
![]() | 6 ylcc 2018-03-16 09:37:46 +08:00 这个 db 用了 orm 么,如果是用了 sqlalchemy,可以 from sqlalchemy.exc import SQLAlchemyError, 捕捉 SQLAlchemyError |
![]() | 7 ilumer 2018-03-16 15:56:51 +08:00 把 add 放到 try 里,如果你的 sqlalchemy 中的配置没有把 auto flush 改成 False 那么你在 add 的过程中会出现自动的 commit(不够准确)。这个你可以把 echo 设置为 True 应该就可以发现了。 |