【问题标题】:sqlalchemy multiple flush before commitsqlalchemy 提交前多次刷新
【发布时间】:2019-05-01 18:18:07
【问题描述】:

我想将记录插入 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语句却做的很好?我已经为此苦苦挣扎了好几个小时。您的帮助将不胜感激。非常感谢!!!

这是错误日志:

回溯(最近一次通话最后一次):
文件
“/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(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(无缓冲=无缓冲)
文件
“/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()

文件 “/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/connections.py”, 第 683 行,在 _read_packet packet.check_error()
文件 “/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 中引发 errorclass(errno, errval) pymysql.err.IntegrityError: (1048, "列 'email' 不能为空") 上述异常是以下异常的直接原因: 回溯(最近一次通话最后一次):
文件“/卷/代码/上一个
Content/grad/2018_2019/db/final/app/modelController.py”,第 164 行,在 registerIndividual('534 Tilling St', '纽约', '15233', '123@qq.com', '123', '子墨', '唐', 23, 755.23, 0)
文件
"/卷/代码/上一页
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 行,在提交 self.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)
文件 “/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session.py”, 第 2381 行,在 _flush transaction.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 行,在 exit 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 行,在 reraise 提高值
文件 “/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)
文件 “/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(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_clauseelementcompiled_sql,distilled_pa​​rams 中

文件 “/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py”, 第 1200 行,在 _execute_context 上下文中)
文件 “/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(type(exception), exception, 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 raise value.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(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(无缓冲=无缓冲)
文件
“/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()

文件 “/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/connections.py”, 第 683 行,在 _read_packet packet.check_error()
文件 “/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 中引发 errorclass(errno, errval) sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1048, “列'电子邮件'不能为空”)[SQL:'INSERT INTO customer (cID, 电子邮件, 密码, 种类, aID) 值 (%(cID)s, %(email)s, %(passwords)s, %(kind)s, %(aID)s)'] [参数:{'cID': 31, '电子邮件':无,'密码':无,'种类':无,'aID':无}] (此错误的背景:http://sqlalche.me/e/gkpj

进程以退出代码 1 结束

【问题讨论】:

标签: python sqlalchemy


【解决方案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会导致错误。我在实例中添加了关系。希望这可以帮助某人。

【讨论】:

    猜你喜欢
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2016-04-15
    • 2013-01-10
    • 2012-03-05
    • 2013-04-06
    相关资源
    最近更新 更多