插入...在jOOQ

时间:2018-04-23 15:06:00

标签: java sql mariadb jooq

在MariaDB(MySQL)中,我可以执行以下操作:

create table T1 (
    t1_field enum('yes', 'no', 'meh')
);

create table T2 (
    t2_field enum('yes', 'no', 'meh')
);

insert into T1 (t1_field) 
values ('yes'), ('meh');

insert into T2 (t2_field)
select t1_field
from T1;

因为两个枚举都是相同的。如果我尝试在jOOQ中执行最后一个查询,由于类型不兼容,它将无法工作:

using(t)
    .insertInto(T2, T2.T2_FIELD)
    .select(
        select(
            T1.T1_FIELD
        )
        .from(T1)
    )
    .execute();

=> InsertValuesStep1类型中的方法select(Select>)不适用于参数(SelectJoinStep>)

我该如何处理?如何让jumQ中的枚举类型匹配?

1 个答案:

答案 0 :(得分:1)

虽然这两种类型在结构上是相同的,但它们在名义上并不相同。如果它们具有完全相同的定义,则jOOQ不会将MySQL / MariaDB枚举类型视为相同。每个枚举类型都是唯一的。

针对此特定查询的一次性解决方案

但是,您可以通过使用Field.coerce(Field)将一种类型强制转换为另一种类型来解决此问题:

def initUI(self):
    iterator = iter(the_list)
    for r in range(3):
        for c in range(3):
            item = next(iterator)
            var_categories[r,c] = tk.IntVar()
            var_categories[r,c].set(item)
            self.label = tk.Label(self, textvariable=var_categories[r,c], relief="ridge",width=8, height=3)
            self.label.grid(row=r, column=c, sticky='news')

类型强制类似于强制转换,但它对生成的实际SQL查询没有影响。在某种程度上,它就像Java中的不安全的演员一样。

使用代码生成的长期解决方案

如果您希望这两种类型相同,则需要使用using(t) .insertInto(T2, T2.T2_FIELD) .select( select( T1.T1_FIELD.coerce(T2.T2_FIELD) ) .from(T1) ) .execute(); 将所有相关列转换为相同的枚举类型。看到: https://www.jooq.org/doc/latest/manual/code-generation/custom-data-types