Here’s a program I’m trying to write using Macros to fetch the schemas from an object containing slick table defintions. The table definitions look like
object TableDefinitions {
class LocationPictureURLsTable(tag: Tag) extends Table[(Long, java.lang.String)](tag, "LocationPictureURLs") {
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def value = column[java.lang.String]("value")
def * = (id, value)
val query = TableQuery[LocationPictureURLsTable]
}
...
}
import slick.jdbc.PostgresProfile.api._
import scala.quoted._
object DDLGenerator {
inline def generateDDL[T]: Unit = ${ generateDDLImpl[T] }
private def generateDDLImpl[T: Type](using Quotes): Expr[Unit] = {
import quotes.reflect._
val tableDefs = TypeRepr.of[T].typeSymbol.declaredTypes
.filter(_.isClassDef)
.filter(_.typeRef.baseClasses.exists(_.fullName == "slick.lifted.Table"))
val ddlStatementsExprs = tableDefs.map { tableSymbol =>
val tableName = tableSymbol.name
val companionModule = tableSymbol.companionModule
val querySymbol = companionModule.declaredMethods.find(_.name == "query").get
val queryExpr = Ref(querySymbol).asExprOf[TableQuery[?]]
'{
val createIfNotExistsAction = $queryExpr.schema.createIfNotExists
val ddlStatements = createIfNotExistsAction.statements
val fileName = s"./src/main/scala/org/example/sql/$tableName.sql"
println(s"Writing DDL statements for $tableName to $$fileName")
val output = new java.io.PrintWriter(fileName)
ddlStatements.foreach(output.println)
output.close()
}
}
Expr.block(ddlStatementsExprs.toList, '{ () })
}
def main(args: Array[String]): Unit = {
println("Start generating table definitions")
generateDDL[TableDefinitions.type]
println("End generating table definitions")
}
}
But I get the following error:
value schema is not a member of slick.lifted.TableQuery[?]
val createIfNotExistsAction = $queryExpr.schema.createIfNotExists
Does anyone know how I might go about resoving this ?? I think using Scala 2 runtime reflection and it might have been easier to attempt this.
It looks like schema should be an extension method possibly resolved through importing Slick 3.5.0 - slick.jdbc.PostgresProfile . However we have the value schema is not a member of slick.lifted.TableQuery[?]
issue.
Is there an issue with Scala 3 methods and loading the extension method? Or am I missing something in the application?
This has been asked without resolution in Discord