python - 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 结束
解决方案
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会导致错误。我在实例中添加了关系。希望这可以帮助某人。
推荐阅读
- javascript - generateListFromArray() 未定义
- scp - 从需要超级用户 preliveges 的远程服务器复制文件到本地计算机
- hadoop - 如何在 hive 表中选择用于分区和分桶的列?
- java - 如何将 {key1=value1, key2=value2} 之类的字符串转换为 json 字符串或 Jsonobject?
- reactjs - ReactJS:以 pdf 格式渲染数学方程的 svg
- android - 无法使用自定义构建的系统映像启动 Android 模拟器
- php - 如何区分 phalcon 框架控制器中的多个按钮动作?例子; 提交、更新和清除按钮
- sql-server - 是否可以在 SQL Server Express 版本中配置 kerberos 身份验证?
- json - JSON 响应打印
- visual-studio-code - 如何在 VSCode 中访问片段扩展的用户设置