如何使用 scalikejdbc 以自定义类型在 postgres 中保存记录?
How to save record in postgres with custom type using scalikejdbc?
在我的例子中,我在 postgres 中有一个枚举类型:
create type my_type as enum (string value);
还有一些 tables,使用这个作为列类型:
create table A (
...
t my_type,
...
)
在 postgres 中,我可以在 table 中插入新记录,如下所示:
insert into A values(..., 'my_type_value', ...);
Scalikejdbc 生成正确的 sql:
insert into A (...) values (..., 'my_type_value', ...)
但失败并出现错误:
ERROR: column "t" is of type my_type but expression is of type
character varying HINT: You will need to rewrite or cast the
expression.
我试过这样做:
object MyType extends Enumeration {...}
case class A(..., t: MyType, ...)
object A extends SQLSyntaxSupport[A] {
def apply(rs: WrappedResultSet): A = A(..., rs.getString('t'), ...)
}
此外,我尝试在 Scala 代码中添加枚举类型的隐式转换:
object MyType extends Enumeration {
implicit def stringToValue...
implicit def valueToString ...
}
但这也没有帮助。
插入代码如下所示:
withSQL {
insertInto(A).namedValues(
...
A.column.t-> e.t, // e - passed entity into insert fun
....
)
}.update().apply()
终于解决了。
我必须添加隐式转换器:
implicit val valueToParameterBinder: ParameterBinderFactory[MyType] = ParameterBinderFactory {
value => (stmt, indx) => stmt.setObject(indx, value, Types.OTHER)
}
object A extends SQLSyntaxSupport[A] {
def apply(rs: WrappedResultSet): A = A(..., rs.getString('t'), ...) // just call getString as usual
}
在我的例子中,我在 postgres 中有一个枚举类型:
create type my_type as enum (string value);
还有一些 tables,使用这个作为列类型:
create table A (
...
t my_type,
...
)
在 postgres 中,我可以在 table 中插入新记录,如下所示:
insert into A values(..., 'my_type_value', ...);
Scalikejdbc 生成正确的 sql:
insert into A (...) values (..., 'my_type_value', ...)
但失败并出现错误:
ERROR: column "t" is of type my_type but expression is of type character varying HINT: You will need to rewrite or cast the expression.
我试过这样做:
object MyType extends Enumeration {...}
case class A(..., t: MyType, ...)
object A extends SQLSyntaxSupport[A] {
def apply(rs: WrappedResultSet): A = A(..., rs.getString('t'), ...)
}
此外,我尝试在 Scala 代码中添加枚举类型的隐式转换:
object MyType extends Enumeration {
implicit def stringToValue...
implicit def valueToString ...
}
但这也没有帮助。
插入代码如下所示:
withSQL {
insertInto(A).namedValues(
...
A.column.t-> e.t, // e - passed entity into insert fun
....
)
}.update().apply()
终于解决了。 我必须添加隐式转换器:
implicit val valueToParameterBinder: ParameterBinderFactory[MyType] = ParameterBinderFactory {
value => (stmt, indx) => stmt.setObject(indx, value, Types.OTHER)
}
object A extends SQLSyntaxSupport[A] {
def apply(rs: WrappedResultSet): A = A(..., rs.getString('t'), ...) // just call getString as usual
}