Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Flask SQLAlchemy:SAWarning:Identity map已具有(对象)的标识,将其替换为新刷新的对象_Python_Python 3.x_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Python Flask SQLAlchemy:SAWarning:Identity map已具有(对象)的标识,将其替换为新刷新的对象

Python Flask SQLAlchemy:SAWarning:Identity map已具有(对象)的标识,将其替换为新刷新的对象,python,python-3.x,sqlalchemy,flask-sqlalchemy,Python,Python 3.x,Sqlalchemy,Flask Sqlalchemy,因此,我制作了一个个人网络服务器,用于抓取一些网站并在网页上显示数据。但是,当我尝试将结果提交到数据库时,我会为提交的每个视频收到一个警告。我想知道这个警告是否可以修复或至少隐藏 这是我的密码: 从web\u导入数据库 从web_.models导入视频 old_db=Video.query.all()#要与新数据库进行比较的现有数据库 db_queue=list()#即将添加到数据库的刮取结果 ###在这里进行web抓取以填充db_队列 db.drop_all()#重置数据库 db.create

因此,我制作了一个个人网络服务器,用于抓取一些网站并在网页上显示数据。但是,当我尝试将结果提交到数据库时,我会为提交的每个视频收到一个警告。我想知道这个警告是否可以修复或至少隐藏

这是我的密码:

从web\u导入数据库
从web_.models导入视频
old_db=Video.query.all()#要与新数据库进行比较的现有数据库
db_queue=list()#即将添加到数据库的刮取结果
###在这里进行web抓取以填充db_队列
db.drop_all()#重置数据库
db.create_all()#重新创建一个新的
对于db_队列中的视频:
db.session.add(vid)#添加所有挂起的结果
db.session.commit()#此处抛出错误
下面是完整的警告输出:

C:\DevApps\Python38\lib\site-packages\sqlalchemy\orm\session.py:1948: SAWarning: Identity map already had
an identity for (<class 'web_scraper.models.Video'>, (2133,), None), replacing it with newly flushed object.
Are there load operations occurring inside of an event handler within the flush?
C:\DevApps\Python38\lib\site packages\sqlalchemy\orm\session.py:1948:SAWarning:Identity map已经有了
(,(2133,),无)的标识,将其替换为新刷新的对象。
刷新中的事件处理程序内部是否发生加载操作?

发出此警告是因为:

  • 将创建一个会话
  • 将现有对象提取到会话中
  • 数据库表将被删除并重新创建
  • 将新对象添加到同一会话中
  • 新对象与添加到原始会话的对象具有相同的ID,因此SQLAlchemy警告会话中的原始对象将被新对象覆盖
old_db
中的对象仍然是原始对象,因此您可以选择忽略警告,但通常最好在警告导致错误之前处理它们(这就是为什么它们是警告)

您可以采取以下一个或两个步骤:

  • 在添加新对象之前,请关闭原始会话并打开新会话
  • 删除表中包含的对象,而不是删除和重新创建表

    • 发出此警告是因为:

      • 将创建一个会话
      • 将现有对象提取到会话中
      • 数据库表将被删除并重新创建
      • 将新对象添加到同一会话中
      • 新对象与添加到原始会话的对象具有相同的ID,因此SQLAlchemy警告会话中的原始对象将被新对象覆盖
      old_db
      中的对象仍然是原始对象,因此您可以选择忽略警告,但通常最好在警告导致错误之前处理它们(这就是为什么它们是警告)

      您可以采取以下一个或两个步骤:

      • 在添加新对象之前,请关闭原始会话并打开新会话
      • 删除表中包含的对象,而不是删除和重新创建表
        • 多亏了 这个代码帮助了我

        • 与数据库的紧密连接
        • 重新创建数据库
        • 重新建立与数据库的连接
        • db.session.close()
          db.drop_all()
          db.create_all()
          
          注意:执行此代码时,将删除数据库及其内部的数据。

          多亏了 这个代码帮助了我

        • 与数据库的紧密连接
        • 重新创建数据库
        • 重新建立与数据库的连接
        • db.session.close()
          db.drop_all()
          db.create_all()
          

          注意:执行此代码时,数据库将被删除,其中包含数据。

          db.create_all
          @sahasrara62之前尝试执行
          commit
          。我收到此错误
          sqlalchemy.exc.OperationalError:(sqlite3.OperationalError)没有这样的表:video
          db.create_all
          @sahasrara62之前尝试执行
          commit
          我遇到了这个错误
          sqlalchemy.exc.OperationalError:(sqlite3.OperationalError)没有这样的表:video
          好的,很高兴知道我明天会检查它是否工作正常!好的,很高兴知道,我明天会检查以修复它。它工作得很好!