from sqlalchemy import Column, Integer, Float, String from sqlalchemy import ForeignKey, ForeignKeyConstraint from geoalchemy2 import Geometry from app.database import Base class MSMInputData(Base): """ 络合模型输入数据模型 存储络合模型(MSM)计算所需的所有输入参数 模型逻辑: 1. 每个记录对应农田样点(Farmland_data)的特定样本 2. 大部分数值通过Soil_data和Parameters表数据计算得来 3. Var字段标识数据类型来源(如:实测值/普查值) """ __tablename__ = 'MSM_input_data' # 主键 id = Column('ID', Integer, primary_key=True, autoincrement=True) # 外键参考Farmland_data表 (复合主键) farmland_id = Column('Farmland_ID', Integer, nullable=False) sample_id = Column('Sample_ID', Integer, nullable=False) # 外键约束定义 __table_args__ = ( ForeignKeyConstraint( ['Farmland_ID', 'Sample_ID'], ['Farmland_data.Farmland_ID', 'Farmland_data.Sample_ID'] ), {'comment': '络合模型输入数据模型'} ) # 过程模型数据索引符 - 标识数据来源(如:PC2013实测、XC2018普查、SP2023三普) var = Column('Var', String(20), nullable=False, comment='过程模型数据索引符') # 化学参数字段(带默认值的列) co2_tot = Column('CO2_g_tot', Float, default=1e-5, nullable=False, comment='二氧化碳全量值') water_volume = Column('watervolume', Float, nullable=True, comment='土壤水体积[cm³/cm³] = Soil_data.POR_Layer') sl_ratio = Column('SL', Float, nullable=True, comment='固液比 = (1-POR_Layer)*bd020_90/(POR_Layer*1)') ph_value = Column('pH', Float, nullable=True, comment='pH值(实测或Soil_data中IDW_*_pH三者之一)') # 金属离子浓度 (mol/L) ca_tot = Column('Ca_plus2_tot', Float, nullable=True, comment='总游离钙 = ExCa_IDW*0.005/(POR_Layer/bd020_90)') mg_tot = Column('Mg_plus2_tot', Float, nullable=True, comment='总游离镁 = ExMg_IDW*0.005/(POR_Layer/bd020_90)') k_tot = Column('K_plus_tot', Float, nullable=True, comment='总游离钾 = ExK_IDW*0.005/(POR_Layer/bd020_90)') na_tot = Column('Na_plus_tot', Float, nullable=True, comment='总游离钠 = ExNa_IDW*0.005/(POR_Layer/bd020_90)') cl_tot = Column('Cl_minus_tot', Float, nullable=True, comment='总游离氯 = (Ca_tot+Mg_tot)*2 + K_tot + Na_tot') cd_tot = Column('Cd_tot', Float, nullable=True, comment='总游离镉 = Cd/112000/(POR_Layer/bd020_90)') # 土壤成分 (kg/kg) hfo_kgkg = Column('HFO_kgkg', Float, nullable=True, comment='不定型铁 = Fed_IDW/1000 + ExAl_IDW*0.00009') clay_kgkg = Column('CLAY_kgkg', Float, nullable=True, comment='粘土矿物 = Soil_data.0002IDW') ha_kgkg = Column('HA_kgkg', Float, nullable=True, comment='活性胡敏酸 = SOM_IDW/1724*F1*F2') fa_kgkg = Column('FA_kgkg', Float, nullable=True, comment='活性富里酸 = SOM_IDW/1724*F1*(1-F2)')