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 应该就可以发现了。
|