首页 > 解决方案 > sqlalchemy 提交前多次刷新

问题描述

我想将记录插入 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()

地址的密钥是 aID,客户的密钥是 cID。它们是自动递增的。在客户中,有一个受地址的 aID 约束的外键。HomeCu 的外键 cID 受 Customer 的 cID 约束。所以我想依次插入Addres、Customer、HomeCu,在此期间我必须在不提交的情况下获取密钥。我使用 flush() 来获取密钥,但在提交操作中失败。为什么在commit操作过程中,email、password之类的值变成了None,而print语句却做的很好?我已经为此苦苦挣扎了好几个小时。您的帮助将不胜感激。非常感谢!!!

这是错误日志:

Traceback(最近一次调用最后):
文件
“/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 cursor.execute(语句,参数)中

文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/cursors.py”,第 170 行,执行结果 = self ._query(查询)
文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/cursors.py”,第328行,在 _query conn.query(q)
文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/connections.py”中,第 516 行,在查询 self._affected_rows = 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 结果中。读()
文件“/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)

文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/err.py”,第 109 行,在 raise_mysql_exception raise errorclass( errno, errval) pymysql.err.IntegrityError: (1048, "Column 'email' cannot be null") 上述异常是导致以下异常的直接原因: Traceback (last last call last):
File "/Volumes/Code/以前
的内容/grad/2018_2019/db/final/app/modelController.py",第 164 行,在 registerIndividual('534 Tilling St', 'New York', '15233', '123@qq.com', '123' , '子墨', '唐', 23, 755.23, 0)
文件
“/Volumes/Code/Previous
Content/grad/2018_2019/db/final/app/modelController.py",第 129 行,在 registerIndividual sessionDB.commit() 中
提交自我中的文件“/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 行,在提交 self._prepare_impl()
文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session .py”,第 447 行,在 _prepare_impl self.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 行,在刷新 self._flush(objects)
_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=True)

退出 兼容中的文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py”,第 66 行.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 行,在 reraise raise值
文件“/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.execute()
文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py”,行395、在执行rec.execute(self)
文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork .py”,第 560 行,在执行 uow
文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py”,第 181 行,在 save_obj 映射器中,表,插入)
文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py”,行830,在_emit_insert_statements执行(语句,多参数)
文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base .py",第 948 行,在执行中返回 meth(self,multiparams,params)
_execute_on_connection 中的文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/sql/elements.py”,第 269 行connection._execute_clauseelement(self,multiparams,params)
文件
“/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,蒸馏参数

_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 行)
文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,第 1413 行,在 _handle_dbapi_exception exc_info
文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/util/compat.py”,第 265 行,在 raise_from_cause reraise(类型(异常),异常,tb=exc_tb,原因=原因)
文件
“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/util/compat.py”,第 248 行,在 reraise 提高值.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 cursor.execute(statement, parameters)

文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/cursors.py”,第 170 行,执行结果 = self ._query(查询)
文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/cursors.py”,第328行,在 _query conn.query(q)
文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/connections.py”中,第 516 行,在查询 self._affected_rows = 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 结果中。读()
文件“/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)

文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/err.py”,第 109 行,在 raise_mysql_exception raise errorclass( errno, errval) sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1048, "Column 'email' cannot be null") [SQL: 'INSERT INTO customer ( cID, email, passwords, kind, aID) VALUES (%( cID)s, %(email)s, %(passwords)s, %(kind)s, %(aID)s)'] [参数: {'cID': 31, 'email': None, 'passwords':无,'种类':无,'aID':无}](此错误的背景: http ://sqlalche.me/e/gkpj )

进程以退出代码 1 结束

标签: pythonsqlalchemy

解决方案


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)

最后我没有使用冲洗。我认为多次使用flush会导致错误。我在实例中添加了关系。希望这可以帮助某人。


推荐阅读