V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sevenQu
V2EX  ›  Flask

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

  •  
  •   sevenQu · 2018-03-15 21:37:06 +08:00 · 2543 次点击
    这是一个创建于 2204 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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()
    
    7 条回复    2018-03-16 15:56:51 +08:00
    linnchord
        1
    linnchord  
       2018-03-15 22:01:10 +08:00
    * except IntegrityError 有别的错就不会 rollback
    * db.session.commit() 可以放到循环外
    sevenQu
        2
    sevenQu  
    OP
       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
        3
    sevenQu  
    OP
       2018-03-15 22:26:49 +08:00
    @linnchord 我去,格式乱了,你的意思是 try,except 和 while 放到同一级吗?一直 add,到最后再一次性 commit,这样好吗?
    ylcc
        4
    ylcc  
       2018-03-16 00:42:45 +08:00
    为什么只抓 IntegrityError,另外才 50 条,一次性 commit 没有问题。
    sevenQu
        5
    sevenQu  
    OP
       2018-03-16 09:23:31 +08:00
    @ylcc 你的意思是,直接 except ?出现问题都会滚?
    ylcc
        6
    ylcc  
       2018-03-16 09:37:46 +08:00
    这个 db 用了 orm 么,如果是用了 sqlalchemy,可以 from sqlalchemy.exc import SQLAlchemyError, 捕捉 SQLAlchemyError
    ilumer
        7
    ilumer  
       2018-03-16 15:56:51 +08:00
    把 add 放到 try 里,如果你的 sqlalchemy 中的配置没有把 auto flush 改成 False 那么你在 add 的过程中会出现自动的 commit(不够准确)。这个你可以把 echo 设置为 True 应该就可以发现了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3374 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:21 · PVG 19:21 · LAX 04:21 · JFK 07:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.