簡體   English   中英

提交前的sqlalchemy多次刷新

[英]sqlalchemy multiple flush before commit

我想將記錄插入3個表。 代碼如下。

    sessionDB.autocommit = False
    # insert Address
    addrRecord = Addres(street=street, city=city, zip_code=zip_code)
    sessionDB.add(addrRecord)
    sessionDB.flush()

    # insert customer
    cRecord = Customer(email=email, passwords=password, kind='individual', aID=addrRecord.aID)
    sessionDB.add(cRecord)
    sessionDB.flush()

    # insert Hcustomer
    homeCRecord = HomeCu(cID=cRecord.cID, fname=first_name, lname=last_name, age=age, marriage=marriage, remain=remain)
    sessionDB.add(homeCRecord)

    print (addrRecord.city, cRecord.kind, homeCRecord.lname)
    sessionDB.commit()

Addres的密鑰是aID,客戶的密鑰是cID。 它們是自動遞增的。 在客戶中,有一個受Addres的aID約束的外鍵。 HomeCu的外鍵cID受客戶的cID約束。 所以我想依次插入Addres,Customer,HomeCu,在此期間我必須不執行提交就獲取密鑰。 我使用flush()獲取密鑰,但是提交操作失敗。 為什么在提交操作期間,諸如email,password之類的值變為None,但打印語句運行得很好? 我已經為此奮斗了幾個小時。 您的幫助將不勝感激。 非常感謝!!!

這是錯誤日志:

追溯(最近一次通話):
文件
“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,行1193,在_execute_context上下文中)
文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/default.py”,行509,在do_execute游標中.execute(語句,參數)

執行結果= self的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/cursors.py”,行170 ._query(查詢)
_query conn.query中的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/cursors.py”,第328行(q)的
查詢self._affected_rows中的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/connections.py”,行516。 = self._read_query_result(unbuffered = unbuffered)
文件
“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/connections.py”,行727,在_read_query_result result.read( )
文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/connections.py”,行1066,讀入first_packet = self .connection._read_packet()

_read_packet packet.check_error中的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/connections.py”,第683行()
文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/protocol.py”,第220行,在check_error err.raise_mysql_exception中(self._data)

在第109行的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/err.py”,在凸起_mysql_exception凸起錯誤類中( errno,errval)pymysql.err.IntegrityError:(1048,“列'email'不能為null”)上面的異常是以下異常的直接原因:Traceback(最近一次調用為last):
文件“ /卷/代碼/上一個
內容/grad/2018_2019/db/final/app/modelController.py“,第164行,在registerIndividual('534 Tilling St','New York','15233','123@qq.com','123', 'Zimo','Tang',23,755.23,0)
文件
“/卷/代碼/上一頁
在registerIndividual sessionDB.commit()中的Content / grad / 2018_2019 / db / final / app / modelController.py“,第129行
在提交自己中的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session.py”,第943行.transaction.commit()
提交自我中的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session.py”,第467行._prepare_impl()
_prepare_impl self中的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session.py”,第447行.session.flush()
刷新自身中的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session.py”,行2254 ._flush(對象)
_flush事務中的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session.py”,第2381行.rollback(_capture_exception =真)

文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py”,第66行,位於出口 compat .reraise(exc_type,exc_value,exc_tb)

重新舉起文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/util/compat.py”,第249行值
文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session.py”,第2345行,在_flush flush_context中。執行()
在執行記錄中的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py”,第395行.execute(個體經營)
文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py”,執行ow行
在save_obj映射器的第181行中,文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py” ,表格,插入)
_emit_insert_statements中的第830行的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py”執行(語句,多參數)
在執行返回中的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,第948行meth(自我,多參數,參數)
文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/sql/elements.py”,行269,在_execute_on_connection返回中connection._execute_clauseelement(自己,多參數,參數)
文件
“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,行1060,在_execute_clauseelement編譯的sql中, distilled_pa​​rams

在_execute_context上下文中,文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,第1200行)
_handle_dbapi_exception exc_info中的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,行1413
在raise_from_cause中,文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/util/compat.py”第265行(type(exception),exception,tb = exc_tb,cause = cause)
文件
“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/util/compat.py”,第248行,正在提高.with_traceback(TB)
文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,行1193,在_execute_context上下文中)
文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/default.py”,行509,在do_execute游標中.execute(語句,參數)

執行結果= self的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/cursors.py”,行170 ._query(查詢)
_query conn.query中的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/cursors.py”,第328行(q)的
查詢self._affected_rows中的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/connections.py”,行516。 = self._read_query_result(unbuffered = unbuffered)
文件
“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/connections.py”,行727,在_read_query_result result.read( )
文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/connections.py”,行1066,讀入first_packet = self .connection._read_packet()

_read_packet packet.check_error中的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/connections.py”,第683行()
文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/protocol.py”,第220行,在check_error err.raise_mysql_exception中(self._data)

在第109行的文件“ /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/err.py”,在凸起_mysql_exception凸起錯誤類中( errno,errval)sqlalchemy.exc.IntegrityError:(pymysql.err.IntegrityError)(1048,“列'email'不能為空”)[SQL:'插入客戶( cID ,電子郵件,密碼,種類, aID ) %(cID)s,%(email)s,%(passwords)s,%(kind)s,%(aID)s)'] [參數:{'cID':31,'email':None,'passwords ':無,'種類':無,'aID':無}}](此錯誤的背景位於: http ://sqlalche.me/e/gkpj)

流程以退出代碼1完成

addrRecord = sessionDB.query(Addres).filter(Addres.street == street).filter(Addres.city == city) \
                .filter(Addres.zip_code == zip_code).first()
            cRecord = Customer(email=email, passwords=password, kind='individual', aID=addrRecord.aID)
            homeCRecord = HomeCu(fname=first_name, lname=last_name, age=age, marriage=marriage, remain=remain)
            homeCRecord.customer = cRecord
            sessionDB.add(cRecord)
            sessionDB.add(homeCRecord)

我最終沒有使用沖洗。 我認為多次使用沖洗會導致錯誤。 我在實例中添加關系。 希望這可以幫助某人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM