You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel打开OData服务报错:EDMX元数据不正确问题求助

问题根因

你遇到的报错和元数据文件无关,问题出在OData服务根路径的响应不符合规范:
Excel的OData连接器首次请求你填写的服务地址时,要求返回仅包含name和url字段的服务文档,用来列举当前服务下所有可用的实体集;但你现在直接把实体集的行数据挂在了服务根路径,响应里携带了业务字段(也就是报错提示的「Article name」对应荷兰语的Artikelnaam字段),所以触发了格式校验错误。


修复步骤

1. 调整路由结构,新增服务根响应

修改app.py的路由配置,拆分服务根路径和实体集路径,新增符合规范的服务文档返回逻辑:

# 原有实体集的路由从/financiele-instrumenten调整为/financiele-instrumenten/FinancieleInstrumentenSet,和元数据里的EntitySet名称保持一致
api.add_resource(FinancieleInstrumenten, '/financiele-instrumenten/FinancieleInstrumentenSet')

# 新增OData服务根路径响应
@app.route("/financiele-instrumenten", methods=['GET'])
def odata_service_root():
    resp = make_response(jsonify({
        # 本地测试可以把这里的$metadata地址换成http://127.0.0.1:1337/financiele-instrumenten/$metadata,和实际访问地址完全匹配即可
        '@odata.context': 'https://stukkenparser.gitlab-minfin.nl/financiele-instrumenten/$metadata',
        'value': [
            {
                # name必须和元数据里的EntitySet的Name属性完全一致
                "name": "FinancieleInstrumentenSet",
                # url对应实体集的访问路径
                "url": "FinancieleInstrumentenSet"
            }
        ]
    }))
    resp.headers['OData-Version'] = '4.0'
    return resp

后续你在Excel里填写的OData服务地址填http://127.0.0.1:1337/financiele-instrumenten即可。

2. 校验字段一致性

检查你从MySQL返回的数据集字段名,必须和financiele-instrumenten.metadata.xml里定义的Property Name完全一致,包括大小写、拼写,不能出现中文翻译的字段名。

3. 补充元数据的主键定义

OData要求所有EntityType必须声明主键,修改你的financiele-instrumenten.metadata.xml,在EntityType节点下补充Key定义:

<EntityType Name="FinancieleInstrumentenType">
  <!-- 新增Key节点,选择表中唯一标识一行数据的字段作为主键 -->
  <Key>
    <PropertyRef Name="Begrotingsjaar" />
    <PropertyRef Name="Begrotingshoofdstuk" />
    <!-- 如有单个唯一主键可只留一个PropertyRef -->
  </Key>
  <Property Name="Begrotingsjaar" Type="Edm.String" Nullable="false" />
  <!-- 其余原有Property节点保持不变 -->
</EntityType>

4. 修复SQL注入风险(可选但强烈建议)

你当前用字符串拼接的方式构造SQL查询,存在严重的SQL注入漏洞,建议替换为参数化查询:

# 示例:带参数的查询写法
qry = "SELECT * FROM FinancieleInstrumenten WHERE Begrotingsjaar = %s LIMIT 25;"
res = pd.read_sql_query(qry, cnx, params=(args['begrotingsjaar'],))

所有带用户输入参数的查询都按这个格式修改即可。


内容的提问来源于stack exchange,提问作者Christian C. Schouten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:00:03