【问题标题】:Session() how upsert from two different table with constraintSession() 如何从具有约束的两个不同表中进行 upsert
【发布时间】:2021-02-05 08:58:18
【问题描述】:

当我对表有一些唯一约束时,如何使用 sqlalchemy 的类 Session() 进行更新插入? 我在 pyarchinit_dbmanager.py 中有这个功能:

def insert_data_session(self, data):
        Session = sessionmaker(bind=self.engine, autoflush=False)
        session = Session()
        session.add(data)
        session.commit()
        session.close()

还有pyarchinit_Config.py中的代码:

    if mapper_class_write == 'PYUS' :
        
        for sing_rec in range(len(data_list_toimp)):
            
            try:
                data = self.DB_MANAGER_write.insert_pyus(
                    self.DB_MANAGER_write.max_num_id(mapper_class_write,
                                                     id_table_class_mapper_conv_dict[mapper_class_write]) + 1,
                    data_list_toimp[sing_rec].area_s,
                    data_list_toimp[sing_rec].scavo_s,
                    data_list_toimp[sing_rec].us_s,
                    data_list_toimp[sing_rec].stratigraph_index_us,
                    data_list_toimp[sing_rec].tipo_us_s,
                    data_list_toimp[sing_rec].rilievo_originale,
                    data_list_toimp[sing_rec].disegnatore,
                    data_list_toimp[sing_rec].data,
                    data_list_toimp[sing_rec].tipo_doc,
                    data_list_toimp[sing_rec].nome_doc,
                    data_list_toimp[sing_rec].coord,
                    data_list_toimp[sing_rec].the_geom)
                    
               
                self.DB_MANAGER_write.insert_data_session(data)
                
                value = (float(sing_rec)/float(len(data_list_toimp)))*100
                self.progress_bar.setValue(value)
                
                QApplication.processEvents()
                
            except Exception as e :
                
                QMessageBox.warning(self, "Errore", "Error ! \n"+ str(e),  QMessageBox.Ok)
                return 0

area_s、scavo_s 和 us_s 是唯一约束。

因此,如果我想在没有冲突的情况下导入数据,那没关系,但如果我想忽略重复数据而只插入新数据,我会遇到唯一约束的问题。

【问题讨论】:

    标签: python-3.x postgresql sqlite sqlalchemy upsert


    【解决方案1】:

    目前我是这样解决的:

     from sqlalchemy.ext.compiler import compiles
     from sqlalchemy.sql.expression import Insert
    
     @compiles(Insert)
     def _prefix_insert_with_ignore(insert, compiler, **kw):
         return compiler.visit_insert(insert.prefix_with('OR IGNORE'), *kw)
    
     def insert_data_session(self, data):
        Session = sessionmaker(bind=self.engine, autoflush=False)
        session = Session()
        session.add(data)
        session.commit()
        session.close()
    

    所以我可以跳过 uniqconstarint 并添加新数据并忽略其他数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-05
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2016-09-30
      相关资源
      最近更新 更多