sevenQu
V2EX  ›  Flask

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

  •  
  •   sevenQu · Mar 15, 2018 · 3724 views
  •   You need to sign in to view this topic
    This topic created in 3143 days ago, the information mentioned may be changed or developed.

    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 replies  •  2018-03-16 15:56:51 +08:00
    linnchord
        1
    linnchord  
       Mar 15, 2018
    * except IntegrityError 有别的错就不会 rollback
    * db.session.commit() 可以放到循环外
    sevenQu
        2
    sevenQu  
    OP
       Mar 15, 2018
    @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
       Mar 15, 2018
    @linnchord 我去,格式乱了,你的意思是 try,except 和 while 放到同一级吗?一直 add,到最后再一次性 commit,这样好吗?
    ylcc
        4
    ylcc  
       Mar 16, 2018
    为什么只抓 IntegrityError,另外才 50 条,一次性 commit 没有问题。
    sevenQu
        5
    sevenQu  
    OP
       Mar 16, 2018
    @ylcc 你的意思是,直接 except ?出现问题都会滚?
    ylcc
        6
    ylcc  
       Mar 16, 2018
    这个 db 用了 orm 么,如果是用了 sqlalchemy,可以 from sqlalchemy.exc import SQLAlchemyError, 捕捉 SQLAlchemyError
    ilumer
        7
    ilumer  
       Mar 16, 2018
    把 add 放到 try 里,如果你的 sqlalchemy 中的配置没有把 auto flush 改成 False 那么你在 add 的过程中会出现自动的 commit(不够准确)。这个你可以把 echo 设置为 True 应该就可以发现了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1223 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 20:19 · PVG 04:19 · LAX 13:19 · JFK 16:19
    ♥ Do have faith in what you're doing.