Postgresql 将Scala Slick与数据库枚举一起使用

Postgresql 将Scala Slick与数据库枚举一起使用,postgresql,scala,slick,slick-3.0,Postgresql,Scala,Slick,Slick 3.0,使用Slick 3和PostgreSQL,我需要查询和更新一个列类型为enum的表: 创建类型WeekDay作为枚举'sun','mon','tue','wed','thu','fri','sat'; 创建表班次 id串行主键, 用户id整数, 分支id整数, 起始整数, 持续时间整数, 工作日 -外键等。 ; 我尝试使用Slick的MappedColumnType[java.time.DayOfWeek,String],但这并不能满足Postgres的类型检查器TBH的要求,正确地说: org

使用Slick 3和PostgreSQL,我需要查询和更新一个列类型为enum的表:

创建类型WeekDay作为枚举'sun','mon','tue','wed','thu','fri','sat'; 创建表班次 id串行主键, 用户id整数, 分支id整数, 起始整数, 持续时间整数, 工作日 -外键等。 ; 我尝试使用Slick的MappedColumnType[java.time.DayOfWeek,String],但这并不能满足Postgres的类型检查器TBH的要求,正确地说:

org.postgresql.util.PSQLException: ERROR: column "day" is of type weekday but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.
  Position: 92
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2412)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2125)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:297)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:428)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:354)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:169)
    at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:136)
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
    at slick.jdbc.JdbcActionComponent$InsertActionComposerImpl$SingleInsertAction.$anonfun$run$15(JdbcActionComponent.scala:520)
表格类别:

类ShiftTabletag:Tag扩展表[Shift]标记,移位{ 导入Mappers.dayOfWeekMapper def id=列[Long]id,O.AutoInc,O.PrimaryKey def userId=列[Long]用户\u id def branchId=列[Long]分支\u id def start=列[Int]start 定义持续时间=列[Int]持续时间
def day=column[DayOfWeek]day/看起来您可以使用不带pg slick的字符串映射到枚举

诀窍是向数据库中添加强制转换,如中所述:

使用INOUT作为赋值创建随工作日变化的角色类型 用INOUT描述避免编写用于强制转换和AS赋值的函数,以便在赋值时隐式应用强制转换

然后可以使用MappedColumnType.base[java.time.DayOfWeek,String]来定义从列到DayOfWeek的映射


我在这里放置了一个可运行的示例:

看起来您可以使用不带pg slick的字符串映射到枚举

诀窍是向数据库中添加强制转换,如中所述:

使用INOUT作为赋值创建随工作日变化的角色类型 用INOUT描述避免编写用于强制转换和AS赋值的函数,以便在赋值时隐式应用强制转换

然后可以使用MappedColumnType.base[java.time.DayOfWeek,String]来定义从列到DayOfWeek的映射


我在这里放置了一个可运行的示例:

看起来有人已经遇到了相同的问题:谢谢!我正在其他项目中与slick pg合作,但我希望找到一个不需要额外库的解决方案,因为我认为问题很小,可以在本地解决:-看起来有人已经遇到了相同的问题em:谢谢!我在其他项目中与slick pg合作,但我希望找到一个不需要额外库的解决方案,因为我认为问题很小,可以在本地解决:-