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
相关产品推荐
相关产品推荐

