当前位置: 首页 > 知识库问答 >
问题:

sqlalchemy提交前多次刷新

杭镜
2023-03-14

我想在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受客户的cID约束。所以我想插入地址,客户,HomeCu顺序,在此期间,我必须得到密钥而不做提交。我使用flush()来获取密钥,但在提交操作中失败。为什么在提交操作中,像电子邮件、密码这样的值变成无,但打印语句做得很好?我已经为此挣扎了几个小时。您的帮助将不胜感激。非常感谢!!!

以下是错误日志:

回溯(最近一次调用):
文件
“/usr/local/ceral/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/sqlalchemy/engine/base.py”,第1193行,在do_execute cursor的第509行的“执行上下文”
文件“/usr/local/ceral/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/sqlalchemy/engine/default.py”。执行(语句、参数)

文件“/usr/local/ceral/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/pymysql/cursors.py”,第170行,在execute result=self中_查询(query)
文件/usr/local/ceral/python3/3.6.3/Frameworks/Python.Frameworks/Versions/3.6/lib/python3.6/site packages/pymysql/cursors.py”,第328行,在查询conn.query(q)
文件/usr/local/ceral/python3/3.6.3/Frameworks/Python.Frameworks/Frameworks/Versions/3.6/lib/python3.6/site packages/pymysql/connections.python3.6/site packages.py,第516行_受影响的行=自身_读取查询结果(unbuffered=unbuffered)
文件
“/usr/local/ceral/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/pymysql/connections.py”,第727行,在读取查询结果中。read()
文件“/usr/local/ceral/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/pymysql/connections.py”,第1066行,在read first_packet=self中。连接_读取数据包()

文件“/usr/local/ceral/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/pymysql/connections.py”,第683行,在“读取”数据包中。检查check\u error()中的第220行中的“/usr/local/ceral/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/pymysql/protocol.py”。引发\u mysql\u异常(self.\u数据)

File"/usr/local/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/err.py",第109行,在raise_mysql_exception提高错误类(errno,errval)pymysql.err.完整性错误:(1048,"列'email'不能为空")上述异常是以下异常的直接原因: Traceback(最近一次调用):
文件/卷/代码/前
内容/grad/2018_2019/db/最终/应用/模型ontroller.py",第164行,在寄存器个人('534 Tilling St','New York','15233','123@qq.com','123','Zimo','Tang',23, 755.23, 0)
文件
"/卷/代码/上一个
内容/grad/2018_2019/db/最终/app/ModelController.py",第129行,在寄存器中个别会话DB。提交()
文件"/usr/本地/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session.py",第943行,在提交self.transaction.commit()
文件"/usr/本地/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session.py",第467行,在提交自己。_prepare_impl()
文件"/usr/本地/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session.py",第447行,_prepare_implself.session.flush()
File"/usr/loce/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session.py",第2254行,同花自我。_flush(对象)
File"/usr/loce/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session.py”,第2381行,_flushtransaction.rollback(_capture_exception=True)

文件“/usr/local/cillar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/sqlalchemy/util/langhelpers.py”,第66行,退出兼容。重新校准(exc_类型、exc_值、exc_tb)

文件"/usr/本地/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/util/compat.py",第249行,在重新提高值
文件"/usr/本地/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session.py",第2345行,在_flushflush_context.execute()
文件"/usr/local/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py",第395行,在执行rec.execute(自我)
File"/usr/local/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py",第560行,在执行uow
File"/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/本地/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py",第830行,_emit_insert_statements执行(语句,多参数)
文件"/usr/本地/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py",第948行,在执行返回meth(自我,多参数,参数)
文件"/usr/本地/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/sql/elements.py",第269行,在_execute_on_connection返回连接。_execute_clauseelement(自我,多参数,参数)
File
"/usr/loce/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py",第1060行,_execute_clauseelementcompiled_sql,distilled_params

文件"/usr/本地/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py",第1200行,在_execute_context上下文中)
文件"/usr/本地/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py",第1413行,在_handle_dbapi_exceptionexc_info
文件"/usr/本地/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/util/compat.py",第265行,在raise_from_causererave(类型(异常),异常,tb=exc_tb,原因=原因)
文件
"/usr/本地/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/util/compat.py",第248行,在reravevalue.with_traceback(tb)
文件/usr/本地/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py,第1193行,在_execute_context上下文中)
文件/usr/本地/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/default.py,第509行,在do_executecursor.execute(声明,参数)

文件“/usr/local/ceral/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/pymysql/cursors.py”,第170行,在execute result=self中_查询(query)
文件/usr/local/ceral/python3/3.6.3/Frameworks/Python.Frameworks/Versions/3.6/lib/python3.6/site packages/pymysql/cursors.py”,第328行,在查询conn.query(q)
文件/usr/local/ceral/python3/3.6.3/Frameworks/Python.Frameworks/Frameworks/Versions/3.6/lib/python3.6/site packages/pymysql/connections.python3.6/site packages.py,第516行_受影响的行=自身_读取查询结果(unbuffered=unbuffered)
文件
“/usr/local/ceral/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/pymysql/connections.py”,第727行,在读取查询结果中。read()
文件“/usr/local/ceral/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/pymysql/connections.py”,第1066行,在read first_packet=self中。连接_读取数据包()

文件“/usr/local/ceral/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/pymysql/connections.py”,第683行,在“读取”数据包中。检查check\u error()中的第220行中的“/usr/local/ceral/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/pymysql/protocol.py”。引发\u mysql\u异常(self.\u数据)

File"/usr/local/Cellar/python3/3.6.3/框架/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/err.py",第109行,在raise_mysql_exception引起错误类(errno,errval)sqlalchemy.exc.完整性错误:(pymysql.err.完整性错误)(1048,列'email'不能为空") [SQL:'插入到客户(cID,电子邮件,密码,种类,aID)值(%(cID)s,%(email)s,%(密码)s,%(种类)s,%(aID)s)'][参数:{'cID': 31,'email':无,'密码':无,'种类':无,'aID':无}](此错误的背景:http://sqlalche.me/e/gkpj)

退出代码1的过程结束

共有1个答案

尉迟跃
2023-03-14
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)

我最后没有用冲水。我认为多次使用刷新会导致错误。我在实例中添加了关系。希望这能帮助到某人。

 类似资料:
  • 问题内容: 在JPA中,如果我们调用EntityTransaction.commit(),它会自动调用EntityManager.flush()吗?还是我们都应该称呼它们?有什么区别?因为我在使用JPA时遇到问题,所以当我向数据库中插入实体时,我会调用persist()。在数据库中,数据已插入(可以获取),但是该数据未显示在我的应用程序中(我使用findAll()进行获取)。在另一个实体上,它出现

  • 在JPA中,如果我们调用EntityTransaction。commit(),它是否自动调用EntityManager。flush()?或者我们应该叫他们两个?有什么区别?因为我对JPA有问题,当我向数据库插入实体时,我调用persist()。在数据库中,数据已经插入(可以提取),但该数据没有显示在我的应用程序中(我使用findAll()提取)。在另一个实体上,它出现了。有什么我不知道的吗?我使用

  • 这就是我的表单的样子: 如果用户快速按下提交按钮10次,表单也将提交10次。我尝试将添加到submit按钮和下面的脚本中,但这并不能起到任何作用: 有什么解决方法吗?

  • 我有一个kafkalistener,可以一次监听一批消息,如下所示 我的问题是,有没有一种方法可以监听多批消息并只提交一次。例如,如果我在Kafka主题中有1000条消息,我希望以10批的形式一次听100条消息,并在处理10批消息后提交偏移量。

  • 问题内容: 如何设置初始化我的Flask应用程序以将Flask-SQLAlchemy设置为自动提交模式,除非我明确地不使用事务? 会话“ 开始通信后即开始数据库事务 ”。这是否会影响Postgres的难度比MySQL? 通过Instagram, 自动提交模式;在这种模式下,Psycopg2不会对任何查询发出BEGIN / COMMIT;相反,每个查询都在其自己的单语句事务中运行。这对于不需要事务语

  • 我有一个场景,我需要执行一系列流程,每个步骤都在独立的应用程序中完成和扩展。我正在为所有交换使用主题交换。当前拓扑如下所示: P- 我们正在“版本化”队列,以处理可能影响消息结构的需求更改。绑定可能如下所示: 步骤1。exchange绑定到步骤1。v1。使用绑定键step1排队。v1 步骤1。exchange绑定到步骤1。v2。使用绑定键step1排队。v2级 还有其他与版本无关的绑定模式也使局部