span8
span4
你好,
我目前在我的PostgreSQL和Postgis的作者有一个问题。
当将feature操作设置为“INSERT”时,INSERT将对表的所有列执行,而不是只对属性定义中指定的列执行。
它会导致特性属性中没有定义但在数据库中有默认值的列上出现空数据。
为例:
我有一个4列的表(column_1,column_2,column_3,column_4)。
的column_3有一个默认值('my_default')
在我的脚本中,我有一个特性可以将一些数据插入到这个表中。该特性有一个自动属性定义(以避免每次修改脚本时定义每个新列)。
但是我的客户没有column_3和column_4的任何数据。
因此,FME中的特性在其属性定义中只定义了column_1和column_2(因为我选择了automatic definition选项)。
运行脚本后,我期望的结果是:
column_1 | column_2 | column_3 | column_4 |
data1.1 | data1.2 | my_default | 零 |
而不是这个,我有这样的结果:
column_1 | column_2 | column_3 | column_4 |
data1.1 | data1.2 | 零 | 零 |
因为FME执行这个请求:
插入my_schema。my_table (column_1, column_2, column_3, column_4) VALUES ('data1.1', 'data1.2', NULL, NULL);
而不是这个:
插入my_schema。my_table (column_1, column_2) VALUES ('data1.1', 'data1.2');
因为它为column_3插入空值,所以不能使用默认值。
我的问题:
有什么方法可以避免这种行为并保持我的默认值吗?
PS:我把我的案例做了极大的简化,因为我们的数据模型在不断的发展,在FME的属性定义中定义每个表的结构是很复杂的。只在有数据的列中插入,让其他人使用默认值会更容易。
自动定义对我们很有帮助,因为我们只需用正确的名称命名一个字段,就可以将它插入到DB中(我们不必将它定义到属性定义中)。
在我们的团队努力增加对它的支持时,有几个工作区可能会有所帮助(相关:FMEENGINE-8945)。
方法1:
这种方法允许数据库根据PGAdmin中的列属性设置默认值。
方法2:
使用转换器设置默认值并使用PostgreSQL编写器编写特性。这可以使用许多不同的转换器来完成,但是本例使用了NullAttributeMapper在使用PostgreSQL编写特性之前设置默认值。
也可以在转换器中使用条件语句AttributeManager。
我附加了一个示例工作区,它演示了这是如何工作的。如果您想尝试运行工作区,首先在PGAdmin的公共模式中创建一个名为“TestCreateColumns”的新表,包含4列:
列名 | 类型 |
C1 | 文本 |
C2 | 字符 |
C3 | 双击此列上的默认值——我使用了100 |
C4 | 双 |
接下来,使用启用的书签运行工作区(在提示时设置数据库连接),并在PGAdmin中查看输出。
你好,
谢谢你的回答,抱歉迟到了。
你的两种方法似乎很有趣,但不能解决我的问题。
实际上,我需要一个不必指定每个没有值的字段的解决方案。
我有数百个表和数千个字段。我们的数据模型在不断发展,几乎不可能每次都检查每个字段。
这就是我使用动态写入器的原因。但是,与普通的写入器一样,它们强制在默认列中使用NULL值。
现在我使用一个SQL脚本,它通过用默认值替换每个NULL和空值来完成这项工作。
祝你有美好的一天
在作家水平:
最简单的方法是在写入器级别设置默认值。(如果必须将整个列设置为相同的值)
只需右键单击writer上的属性并使用Edit属性。输入默认值。
作家之前:
使用属性创建者,直接从表中导入列。
使用脚本获取al约束。获取默认值并有条件地(为null或缺失)使用属性创建者的实例设置属性。
嗨@吉奥,
感谢您的回答和时间。不幸的是,这不是我要找的。
在写入器级别添加默认值使我可以用默认值定义每个列,即使我没有该列的数据。
=>由于我的MCD是不断发展的(不是每天,而是每个月),我需要检查所有这些字段每次我编辑我的脚本和添加/删除默认字段。
=>到很多工作(非常时间消耗)。
使用属性creator:与上面一样(但这是我第一次解决这个问题)。
使用脚本:目前我正在做什么,但在SQL后直接写入:可能是最简单的方式来维护所有这些默认值(但需要SQL技能有一些干净)。
实际上,我的脚本帮助我们将数据从客户数据模型导入到自己的数据模型。我的目标是创建一个脚本,供那些在FME方面没有很好技能的人和每个客户使用。
该脚本包含了writer中所需的所有内容,因此我的同事只需导入customers特性,进行一些简单的转换(重命名字段,更改一些值)并将其插入writer的特性中。
如果一些FME开发人员可以添加一个选项,只在定义的列中插入,那将是一件非常好的事情。
©2019安全亚搏在线软件公司法律