
简介面向GIS数据迁移与更新场景PDF文档《FME更新数据库流程整理》对FME操作流程进行了完整技术梳理。文档聚焦FME在数据库更新中的关键环节涵盖从GDB到SDE、从SDE到SDE两种典型迁移路径并详细拆解数据源添加、服务器参数设置、格式参数调整等配置步骤。同时整理了AttributeCreator、AttributeFilter、UUIDGenerator等常用转换器的实际用途便于读者按需查阅。包内共1个PDF文件大小1.07MB内容精炼适合数据工程师、GIS开发者在迁移项目中作为案头参考。目前已有127人学习下载。通过文档梳理读者可以掌握FME入库存取的完整思路理解新旧系统表结构对比、非空字段空值处理、关联数据空格清理、版本设置等常见问题的排错方法并借助操作流程图与步骤说明减少实际迁移中的试错成本提高数据入库效率。1. FME 更新数据库为什么先摸表结构比先拖转换器更重要「FME 更新数据库」这几个字听起来像格式转换真正做过一次数据迁移的人都知道它最值钱的地方在批量更新和可重复执行。用 FME 2014 把数据从 GDB 迁到 SDE或者从 SDE 迁到 SDE核心难点从来不是拖几个转换器而是动手前有没有把原生产机和目的服务器的表结构摸透。新旧表的差异在哪数据变化的入口就在哪。这份 PDF 把一套完整的 FME 入库流程整理成了可照着做的操作手册适合正在做 GIS 数据迁移、库表更新、或者被非空约束和关联字段折腾过几轮的数据工程师。照着走一遍能少花很多回头查日志的时间。2. 总体流程拆解新旧表结构对比、需求讨论与入库前检查2.1 摸底原生产机表结构直接决定迁移方案FME 这套流程里读数据端读进来的字段最终会映射到写数据端的目标表字段上。如果源表有 20 个字段目标表只需要 15 个多出的 5 个字段要么在转换器里被过滤掉要么在写模块里不勾选。反过来说目标表有 10 个非空字段源表只提供了 8 个那转换跑完也写不进去。所以我拿到迁移任务的第一件事不是开 FME而是先打开数据库把两端表结构拉出来逐列比对。原生产机重点看这几项表名和字段名字段类型与长度是否允许空值默认值主键和索引以及参与关联的字段。关联字段尤其容易出问题后面避坑章节里会详细说。我一般会用系统表或数据字典视图把表结构导出成 Excel一张表一个 Sheet字段名列在左侧类型、长度、可空、默认值逐列排开方便后续对照。这一步不建议省也别只靠研发人员口头描述数据库里的实际结构才是最终依据。2.2 摸底目的服务器约束与注册状态是隐形门槛目的服务器的表结构摸底重点不在字段名而在约束和状态。SDE 库里的表往往带着业务约束非空约束、唯一约束、外键关联甚至还有触发器。这些约束在迁移时不会显示在 FME 的映射列表里但一旦数据不满足FME 就报错而且报错信息往往很笼统。另外还有一项必须在 catalog 里确认的——表是否注册版本。如果表已经注册了版本FME 写数据端要选择 versioning如果没注册则选 transactions。这个选错轻则数据写不进去重则版本冲突直接锁表。判断方法后面单独讲这里先记住一点目的服务器摸底时把每张目标表的约束情况和注册状态记下来这个信息在配置写数据端参数时用得上。2.3 三方讨论迁移需求客户、研发、数据人员各看什么原文里强调「客户、研发人员、数据人员共同讨论迁移需求」这一步在实际项目里非常容易走过场。客户关心的是业务规则这个字段到了新系统还叫不叫这个名字那个状态值从 1 改成 2 需不需要迁移时同步改。研发关心的是库结构新表的主键变了原来用 OBJECTID 关联的逻辑到了新库要用 UUID 关联。数据人员关心的则是数据质量源表里有空值、有脏数据、有重复记录这些都要在迁移前暴露出来。三方讨论的目标是确认两件事一是迁移过程中需不需要对数据做加工二是数据变化的口子开在哪。比如源表里字段 A 的值要拆分到目标表 B、C 两个字段这就是迁移需求。如果讨论下来需求不变更才能进入下一步的入库前检查。注意这里的顺序先讨论需求再检查数据最后才是编写 FME 工程不要把顺序倒过来。2.4 入库前检查清单查完这五类问题再跑工程数据入库前的检查我一般固定查五类问题每类都能对应到后面运行期会出现的报错。这里直接列一个检查清单照着逐项确认即可。检查项查什么怎么查未检查的后果非空字段空值源表中对应目标表非空约束的字段是否存在空值用 SQL 统计 IS NULL 记录运行时报「索引超出范围」或写入失败关联字段空格参与表关联的字段首尾是否带空格用 LENGTH 和原字符串对比迁移后两张表关联不上字段长度超限源表字段长度是否超过目标表字段定义按目标表长度用 SUBSTR 预检数据被截断或写入报错主键唯一性源表主键或关联键是否有重复用 GROUP BY 统计重复项SDE 唯一约束拦截写入版本注册状态目标表在 catalog 里是否已注册版本右键查看 Register with Geodatabase版本模式选错导致锁表提示这张清单应该打印出来贴在工位上跑工程前逐项打勾。熟练之后可以写成 SQL 脚本一次跑完但首次做迁移项目还是建议人工过一遍视觉确认。3. 从 GDB 迁移到 SDE读数据端、写数据端与四类参数配置3.1 读数据端添加 GDB 数据集并勾选图层在 FME 2014 里新建工程第一步是添加读模块。常用做法是点击工具栏上的读模块图标或在工作台空白处右键选择 Add Reader。弹出的对话框里数据集格式选择 GDBFile Geodatabase然后浏览到本地的 GDB 文件目录。这里有个细节FME 里的 GDB 不是一个文件而是一个文件夹选择时要定位到 .gdb 这个目录本身而不是它下面某个要素类。读模块添加完成后左侧导航栏会列出 GDB 里的所有图层。此时只需要勾选要迁移的图层不需要全部打勾。有人习惯全选觉得多读几个图层没什么影响但数据量大的时候未勾选的图层也会被逐一遍历白白拉长读取时间。我一般只勾选与目标表对应的图层并且顺手把图层按业务模块分组管理。3.2 写数据端SDE 连接参数与 Parameters 设置读模块配置好之后添加写模块。数据集格式选择 SDEArcSDE也就是原文里说的从 GDB 迁到 SDE 的目标端。添加写模块时会弹出连接参数对话框核心参数包括服务器地址、实例、数据库名、用户名和密码。参数说明注意事项ServerSDE 所在服务器地址填 IP 或主机名不要填带协议的前缀InstanceSDE 服务名或端口常见 sde:sqlserver、端口号等按项目环境填Database目标数据库名与源 GDB 无关填 SDE 对应的业务库User / Password数据库账号注意账号需要有建表、写数据权限Version版本名表已注册版本则填对应版本未注册则填 sde.DEFAULT这几项参数填完之后点击对话框里的 Parameters 按钮还能继续设置用户、版本等更细粒度的选项。写模块的 SDE 连接本质上是一次数据库会话配置参数填反了后面转换时会出现连接成功但写不进数据的状况所以连完先保存工程不要急着跑。3.3 格式参数坐标系、批量大小与转换属性写模块添加完成后工作台上会看到读模块到写模块的映射连接线。默认情况下 FME 会按字段名自动匹配但实际迁移很少这么顺利。此时点击写模块的 Format Parameters里面有几项参数决定写入行为的边界。第一项是坐标系。源 GDB 和目标 SDE 如果坐标系不一致FME 会按默认规则做坐标转换但有些情况下比如动态坐标系没设置好要素会跑到错误的位置。我习惯在 Format Parameters 里显式指定目标坐标系避免依赖默认为空。第二项是批量写入大小。默认值通常按行批量提交数据量大的时候可以调大但不要一次调几万SDE 服务端的事务日志不一定撑得住。第三项是转换属性设置这一步是把源字段映射到目标字段的关键环节。3.4 运行验证日志与要素统计所有参数配置好之后点击运行按钮FME 开始逐要素读取、处理、写入。转换完成后工作台底部日志窗口会显示转换成功的提示这是最直接的判断依据。但日志显示成功不等于数据没问题我一般还会做两个验证一是查看日志里统计的处理要素总数和目标表实际记录数对比数字对不上就是有要素被跳过二是随机抽几个关键图层在 ArcMap 里加进来目视检查坐标位置、字段值、关联关系肉眼过一遍。这一步看似多余但非常值得做。FME 日志里的「成功」只代表转换流程没中断不代表业务正确。如果源表里有些记录写不进 SDEFME 的默认处理方式可能是报错停止也可能是跳过继续具体要看工程里的错误处理设置。首次迁移建议用一个小数据集试跑验证整个链路没问题后再放开全量。4. 入库常用转换器盘点九个高频器件的分工、参数与组合4.1 属性处理四件套AttributeCreator、AttributeCopier、AttributeFilter、AttributeSplitterAttributeCreator 负责修改已有字段的值或新增字段。它的典型用法是把某个字段值设成常量比如新增一个 JASSTATUS 字段并统一赋值为 1这在迁移时标记数据来源非常实用。参数上重点注意 Creator 的输出字段名如果起了一个和目标表字段重名的名字它会直接覆盖原值如果起新名字则相当于新增字段。区分这两者的逻辑很简单Creator 的输出字段与输入字段同名的是修改不同名是新增。AttributeCopier 是复制一个属性为新属性。比如把字段 NAME 复制为 NAME1Copier 做的是一对一的纯复制不改变原字段。它的使用场景是保留原始值的同时在副本上做加工。注意 Copier 的复制方向是单向的只从源字段复制到目标字段不会反过来联动。AttributeFilter 按属性值把要素分流到不同输出端口。原文给的例子是把 NAME 字段值为「阿城区」和「爱辉区」的记录分别过滤到不同端口。实际配置时先在 Filter 里新建两个条件端口然后每个端口写一个条件表达式比如 NAME 阿城区。要特别注意的是条件端口从上到下按顺序匹配如果两个条件有包含关系先匹配的端口会截走数据后面的端口永远接收不到。所以配置条件时要把最具体的条件放前面。AttributeSplitter 按分隔符分割字符串。原文的场景是 NAME 字段里包含符号 *需要把带 * 的内容拆开。它会把源字符串按分隔符拆成一个列表然后用 ListIndexer 或 ListRangeExtractor 取出指定位置的元素。这里常见的问题是把分隔符写错或漏了去空格导致拆出来的片段带首尾空格后续关联对不上。4.2 日期与列表DateFormatter 和 ListRangeExtractor 的边界DateFormatter 重新格式化日期时间字符串输入可以是几乎任意格式。它最常见的用法是把源库里的日期字符串统一成目标库的格式比如把 2024/01/05 转成 20240105。参数上要关注 Input Format 和 Output FormatFME 支持很多日期格式代码但原数据里夹杂脏值比如空串或错误格式时DateFormatter 会报错配合 AttributeValidator 先做合法性检查更稳。ListRangeExtractor 从列表里提取最小值和最大值。它处理的是 FME 的列表类型数据通常在 AttributeSplitter 之后使用。比如把 NAME 字段按 * 拆成列表后需要取列表里第一个元素或最后一个元素就可以用 ListRangeExtractor也可以搭配 ListIndexer 按下标取。注意 ListRangeExtractor 输出的是数值比较结果如果列表元素是字符串要确认排序规则是否业务上可接受。4.3 几何侧VertexCreator 和 PointConnector 的配合VertexCreator 最常见的使用模式是用点对象替换已有几何对象。原文里写了这个偏好实际场景如源表是面要素但业务上只需要面的中心点就可以用 VertexCreator 的 Replace With Point 模式生成面的质心点。参数上要选对替换模式是追加坐标还是用点替换。选错模式可能导致后续的写模块报几何类型不匹配因为 SDE 目标表定义的是点要素类写入的却是面。PointConnector 按输入点要素的顺序连接成线或面。它的输入必须是有序点集顺序信息通常来自一个序号字段。在入库场景里它常和 VertexCreator 配合先用 VertexCreator 生成点再用 PointConnector 按序号连成线。这个转换器有两个容易翻车的点一是输入点的顺序字段选错导致连线交叉二是点之间有重复坐标导致生成的线拓扑报错。4.4 关联侧UUIDGenerator 与转换器组合链UUIDGenerator 为每个要素生成通用唯一标识符作为新属性添加。原文给的示例是 6a6bfc86-2a52-4c92-99ee-694183012a16这个值在分布式环境下几乎不会重复。它在迁移里的典型用途是新旧系统表结构变化后原来的 OBJECTID 不再作为业务关联键改用 UUID 作为新的关联键同时把旧的 OBJECTID 保留在另一个字段里备查。它是组合链里的收尾器件。一个典型入库链是这样排的UUIDGenerator 生成关联键为后续表间关联做好准备AttributeFilter 按业务条件分流把需要特殊处理的数据分到不同处理分支AttributeSplitter 拆分需要拆的字段把拆好的片段落到新字段AttributeCreator 写入常量标记字段比如数据来源AttributeCopier 保留原始字段副本防止加工过程覆盖原值最后统一进入写模块写入 SDE。这个顺序不是随便排的。UUIDGenerator 必须排在最前因为后续所有分支都可能用到这个关联键。AttributeSplitter 要在 AttributeCreator 之前因为 Splitter 的输出是列表Creator 直接引用列表元素最方便。AttributeCopier 放中间是为了保留原始值作为兜底万一加工后的字段在写库时报错还能用原始字段排查。提示转换器不是越多越好。一个迁移工程里器件超过十个就要考虑是不是源表和目标表结构差异太大应该先统一结构再迁移。转换器只是手段数据干净才是目的。5. 入库避坑三个典型故障的现象、原因与处理步骤5.1 非空字段遇到空值直接迁移会报「索引超出范围」现象FME 转换跑起来后日志窗口报「索引超出范围」部分记录写入失败整个工程中断。原因目标表中有非空约束的字段在源表中对应数据存在空值。FME 写数据端尝试把空值写入非空字段时SDE 返回错误。这个问题的隐蔽性在于报错是运行中断掉的但日志里不会直接告诉你哪个字段为空需要反查。处理步骤查出目标表中所有非空字段用数据字典视图或系统表查看字段的可空属性在源库中对这些字段逐个执行SELECT COUNT(*) FROM 表名 WHERE 字段名 IS NULL找出空值记录与客户和研发人员确认处理方式是补默认值、丢弃记录还是放宽目标表约束在 FME 工程里加 AttributeCreator 或 AttributeFilter按确认结果处理空值后再入库。这个故障最典型的场景是 OBJECTID、eventid 这类关键字段在源表有遗漏。所以排查时优先查这两个字段单查一轮往往就能定位。5.2 关联字段藏在空格里迁移后两张表关联不上现象数据迁移完成后业务系统报表查不到关联数据两张表 JOIN 出来是空的但单独看每张表的数据都在。原因源生产机表里的 eventid 字段内容带了大量空格比如EVT001实际存储值是EVT001。FME 读取时或者写入时自动做了去空格处理目标表里存成了干净的EVT001但关联的另一张表内容没变两边就对不上了。处理步骤先在源库确认字段是否存在空格用SELECT COUNT(*) FROM cpteststation WHERE eventid ! TRIM(eventid)统计受影响记录数确认后执行清理 SQL-- 清理关联字段首尾空格注意先备份或先确认影响行数 UPDATE cpteststation t SET t.eventid TRIM(t.eventid) WHERE t.eventid ! TRIM(t.eventid);说明原文里这步 SQL 写作tirm(t.eventid)实际数据库函数应为TRIMSQL Server 2017 以上支持旧版本可改用LTRIM(RTRIM(...))组合。执行前建议先做 SELECT确认影响行数符合预期再执行 UPDATE。清理完成后重新对比两边表的关联键值用SELECT DISTINCT eventid FROM 表名目检一遍。5.3 版本注册状态搞错versioning 与 transactions 的选择依据现象写入时报版本冲突或者数据写进去了但 ArcMap 里刷新不出来甚至目标表被锁其他用户无法操作。原因FME 写数据端连接 SDE 时在 parameters 里选择的事务模式与目标表实际注册状态不一致。表已经注册版本却选了 transactions或者反过来。处理步骤打开 ArcCatalog在目标表上右键找到 Manage 菜单下的 Register with Geodatabase 选项如果该选项是灰色不可点击说明表已经注册版本FME 写数据端参数应选择 versioning如果该选项是黑色可点击说明表未注册FME 应选择 transactions按确认结果修改写数据端参数后重新运行。判断逻辑并不复杂关键是要先去看状态而不是默认选一个。这个坑容易发生在多人协作的 SDE 库别人注册了版本但你不知道。注意还有一个常见习惯问题是工程跑完发现数据有问题直接在 FME 里点重跑。FME 默认不会清空目标表已有数据重跑会导致重复写入。如果目标表有唯一约束就会报主键冲突。正确做法是先清空目标表数据或者让写模块进入 truncate 模式再执行重跑。6. 从 SDE 迁移到 SDE版本注册判定与三查验证技巧6.1 GDB 到 SDE 与 SDE 到 SDE 的差异其实只在读数据端从 SDE 迁到 SDE 和从 GDB 迁到 SDE整体流程几乎一样。差异只在读数据端数据源类型从 GDB 换成 SDE填写的连接参数与写数据端相同。工作台上的映射结构、转换器配置、写数据端参数都可以直接复用。实际操作时我一般把 GDB 到 SDE 的工程复制一份只改读模块的连接参数然后再检查一遍字段映射。这样能省掉重新搭工程的时间但要注意源库和目标库字段名如果有差异映射连接线会断开需要重新连。6.2 版本注册的判定与选择SDE 到 SDE 迁移最容易在这步踩坑。连接读模块和写模块时两边都是 SDE但目标表的版本注册状态决定写模块的事务模式。这里用一个判定表固定下来状态判定方法写数据端选择已注册版本ArcCatalog 中 Register with Geodatabase 灰色不可点Versioning未注册版本ArcCatalog 中 Register with Geodatabase 黑色可点Transactions判断逻辑要先于工程配置完成不要等运行报错了再回头改。版本注册状态还影响后续数据回滚策略注册版本的表可以用版本管理做历史回溯未注册的表只能靠备份恢复迁移前要确认这一点。6.3 迁移后的三查验证SDE 到 SDE 迁移完成后我习惯做三个检查一是查空值把源表和目标表的非空字段各跑一遍COUNT(*) ... WHERE 字段 IS NULL两侧结果要一致二是查关联把参与业务关联的字段做一次去重对比确认没有空格、没有截断三是查版本状态在 ArcCatalog 里重新核对目标表注册状态确认写入模式与状态匹配。这三个检查做完数据迁移才算真正闭环。那次 eventid 空格问题之后我就养成了一个习惯每次接新库的迁移任务先扫一遍所有关联字段的空格再看一遍目标表注册状态最后才动 FME。后两步加起来不过十分钟但能避开大半的入库返工。希望帮到你。本文还有配套的精品资源点击获取