首页 > 解决方案 > mysql上的表关系以计算新字段

问题描述

我将解释我的结构,但首先我会告诉我需要什么。我有一张带有预测的表格,还有一张带有真实情况数据的表格。我需要计算forecast - happened场。两个表都有坐标字段(经度、纬度)、日期和降水。预测还有一个字段,即进行预测的日期。

class Real(Base):
    __tablename__ = 'tbl_real'

    id = Column(Integer, primary_key=True, autoincrement=True)
    lon  = Column(Integer,index=True)
    lat  = Column(Integer,index=True)
    date = Column(DATE,index=True)
    prec = Column(Integer)
       


class Forecast(Base):
    __tablename__ = 'tbl_forecast'

    id = Column(Integer, primary_key=True, autoincrement=True)
    
    real_id   = Column(Integer,ForeignKey('tbl_real.id'))
    date_pub  = Column(DATE,index=True)
    date_prev = Column(DATE,index=True)
    lon       = Column(Integer,index=True)
    lat       = Column(Integer,index=True)
    prec      = Column(Integer,)
   
class Error(Base):
    __tablename__ = 'tbl_error'

    id = Column(Integer, primary_key=True)
    
    forecast_id     = Column(Integer,ForeignKey('tbl_forecast.id'))
    real_id         = Column(Integer,ForeignKey('tbl_realizado.id'))
    error           = Column(Integer)

要插入Error我正在使用的数据:

def insert_error_by_coord_data(self,real_id,lon,lat,date,prec,session):

    ec_ext   = session.query(Forecast.id,Forecast.prec).filter((Forecast.lon == lon)&
                                 (Extendido.lat == lat)&
                                 (Extendido.date_prev == date)).all()
        
    data = list()
    for row in ec_ext:
            id = row[0]
            if session.query(Erro).get(id) is None:
                prev = comb[1]
                error = prev - prec
                data.append(Erro(id = id,
                                 ext_id = id,
                                 real_id = real_id,
                                 error= error))
            
        if len(data) > 0:
            session.bulk_save_objects(objects=data)
            session.commit()
            session.close()

每个预测文件有 40 个data_prev和 25000 个坐标。每个真实文件有 25000 个坐标。我想了大约 2 个小时,但我只有 80000 行Error。插入记录开始需要 1.03 秒,现在是 3.04 秒。我正在使用 12 cpu multiprocessing,如果您认为错误在这里,请指出,我可以显示代码,但我认为不是。问题是我应该做些什么不同的事情?

标签: pythonmysqlsqlalchemyquery-optimizationlarge-data

解决方案


推荐阅读