Julia中根据DataFrame的id列值匹配名称更新对应mutable struct的方法
Julia实现方案
首先明确核心前提:你当前的核心逻辑是运行期从数据库读取数据、更新结构体,不需要用宏实现主逻辑——宏是编译期展开工具,无法获取运行期才从数据库返回的DataFrame数据,强行用宏只会增加实现复杂度。以下是可直接落地的实现步骤:
1. 前置准备:建立id到结构体实例的映射
你目前只定义了结构体类型,必须先实例化才能存储字段值,同时用字典做映射可以快速匹配id对应的实例:
# 先实例化两个mutable struct,初始值可任意填写,后续会被覆盖 yg_1_inst = yg_1(0) jyg_1_inst = jyg_1(0) # 建立id字符串到对应结构体实例的映射表 const struct_mapping = Dict( "yg_1" => yg_1_inst, "jyg_1" => jyg_1_inst )
如果后续新增更多id对应的结构体,只需在映射表中新增对应键值对即可,无需修改核心逻辑。
2. 核心逻辑实现(普通函数即可,无需宏)
遍历DataFrame、更新结构体、执行SQL插入的逻辑都写在普通函数里,同时注意使用参数化查询避免SQL注入风险:
function update_struct_and_sync_db() # 从数据库读取数据 df = groups() for row in eachrow(df) current_id = row.id # 仅当id在映射表中存在时执行后续操作 if haskey(struct_mapping, current_id) # 把DataFrame中String类型的pop转成Int匹配结构体字段类型 pop_val = parse(Int, row.pop) # 更新对应结构体的pop字段 struct_mapping[current_id].pop = pop_val # 执行参数化插入SQL,不要直接拼接字符串 DBInterface.execute(con, "INSERT INTO pgdb1.groups (pop) VALUES (?)", (pop_val,)) end end end
直接调用update_struct_and_sync_db()即可完成全部需求。
可选:用宏批量生成映射表
如果你后续需要对接大量id对应的结构体,不想手动逐个写映射表条目,可以用宏在编译期批量生成映射表代码:
macro gen_struct_map(struct_types...) map_expr = :(Dict{String, Any}()) for s_type in struct_types s_id = string(s_type) push!(map_expr.args, :($s_id => $s_type(0))) end esc(:(const struct_mapping = $map_expr)) end # 调用宏即可一键生成映射表,只需传入所有结构体类型名 @gen_struct_map yg_1 jyg_1
内容的提问来源于stack exchange,提问作者neutrino
相关产品推荐
相关产品推荐

