在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中的枚举类型匹配?
答案 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