我在sbt启动时遇到以下错误,当两个特定的sbt插件一起添加到其构建定义中的项目时.其中一个sbt插件是scalikejdbc,另一个是我自己的,显然它们在项目的构建定义中的相互包含导致sbt启动时出现此错误:
scala.reflect.internal.Types$TypeError: package macros contains object
and package with same name: blackbox
Run Code Online (Sandbox Code Playgroud)
显然,看起来每个插件都带有不同版本的scala.reflect.macros,从而导致此错误.我可以在sbt插件的罐子里戳,其中其中一个似乎带来了scala/reflect/macros/blackbox.class-
$ jar -tvf scalikejdbc-core_2.10/jars/scalikejdbc-core_2.10-2.4.2.jar | grep black
0 Sat Jun 11 15:51:10 IDT 2016 scala/reflect/macros/blackbox/
405 Sat Jun 11 15:51:04 IDT 2016 scala/reflect/macros/blackbox/package$.class
419 Sat Jun 11 15:51:04 IDT 2016 scala/reflect/macros/blackbox/package.class
Run Code Online (Sandbox Code Playgroud)
- 但是,在这个早期启动阶段很难正确地得出sbt加载的内容,以便确定这个包的哪个版本在这里涉及以及哪些依赖关系带来了它们.
感谢您关于如何进行此调查的建议!
并且为了完整起见 - 我在下面仅仅包括sbt给出的完整错误 - 但我真诚地怀疑它添加了任何信息,所以你可能会忽略它.
scala.reflect.internal.Types$TypeError: package macros contains object and package with same name: blackbox
one of them needs to be removed …Run Code Online (Sandbox Code Playgroud) 我有一些像这样的代码:
println("\nBEGIN Last Revs Class: "+ distinctFileGidsRDD.getClass)
val lastRevs = distinctFileGidsRDD.
foreachPartition(iter => {
SetupJDBC(jdbcDriver, jdbcUrl, jdbcUser, jdbcPassword)
while(iter.hasNext) {
val item = iter.next()
//println(item(0))
println("String: "+item(0).toString())
val jsonStr = DB.readOnly { implicit session =>
sql"SELECT jsonStr FROM lasttail WHERE fileGId = ${item(0)}::varchar".
map { resultSet => resultSet.string(1) }.single.apply()
}
println("\nJSON: "+jsonStr)
}
})
println("\nEND Last Revs Class: "+ lastRevs.getClass)
Run Code Online (Sandbox Code Playgroud)
代码输出(带有大量编辑)类似于:
BEGIN Last Revs Class: class org.apache.spark.rdd.MapPartitionsRDD
String: 1fqhSXPE3GwrJ6SZzC65gJnBaB5_b7j3pWNSfqzU5FoM
JSON: Some({"Struct":{"fileGid":"1fqhSXPE3GwrJ6SZzC65gJnBaB5_b7j3pWNSfqzU5FoM",... )
String: 1eY2wxoVq17KGMUBzCZZ34J9gSNzF038grf5RP38DUxw
JSON: Some({"Struct":{"fileGid":"1fqhSXPE3GwrJ6SZzC65gJnBaB5_b7j3pWNSfqzU5FoM",... )
...
JSON: None() …Run Code Online (Sandbox Code Playgroud) 我尝试使用 ScalikeJDBC 访问 PostgreSQL 9.4 中的数组。DDL:
create table itab (
code varchar primary key,
group_list varchar[]
);
Run Code Online (Sandbox Code Playgroud)
在 Scala 应用程序中定义了一个简单的案例类和加载器。
case class Item(code: String, groupSet: List[String])
trait loader {
def loadAllItems: List[Item] = {
insideReadOnly { implicit session =>
sql"select CODE, GROUP_LIST from ITAB"
.map(e => Item(
e.string("code"),
e.array("group_list").asInstanceOf[Buffer[String]]
)).list.apply()
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行一个应用程序时,我得到运行时异常
java.lang.ClassCastException: org.postgresql.jdbc4.Jdbc4Array cannot be cast to scala.collection.mutable.Buffer
Run Code Online (Sandbox Code Playgroud)
我该如何解决?谢谢。霍维曼。
尝试使用 ScalikeJDBC 和 SQLite。根据提供的示例编写一个简单的代码:
import scalikejdbc._, SQLInterpolation._
object Test extends App {
Class.forName("org.sqlite.JDBC")
ConnectionPool.singleton("jdbc:sqlite:test.db", null, null)
implicit val session = AutoSession
println(sql"""SELECT * FROM kv WHERE key == 'seq' LIMIT 1""".map(identity).single().apply()))
}
Run Code Online (Sandbox Code Playgroud)
它失败但有异常:
Exception in thread "main" java.sql.SQLException: Cannot change read-only flag after establishing a connection. Use SQLiteConfig#setReadOnly and QLiteConfig.createConnection().
at org.sqlite.SQLiteConnection.setReadOnly(SQLiteConnection.java:447)
at org.apache.commons.dbcp.DelegatingConnection.setReadOnly(DelegatingConnection.java:377)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setReadOnly(PoolingDataSource.java:338)
at scalikejdbc.DBConnection$class.readOnlySession(DB.scala:138)
at scalikejdbc.DB.readOnlySession(DB.scala:498)
...
Run Code Online (Sandbox Code Playgroud)
我已经尝试了 scalikejdbc 1.7 和 2.0,错误仍然存在。作为 sqlite 驱动程序,我使用"org.xerial" % "sqlite-jdbc" % "3.7.+".
我可以做什么来修复该错误?
我们正在评估使用scalikejdbc-async进行新的游戏项目.新的postgresql-9.4功能:jsonb及其索引看起来非常有吸引力,scalikejdbc-async也是如此.
有没有办法使用scalikejdbc-async访问JSONB值,如果没有,添加有多难?
谢谢.
我正在玩ScalikeJdbc图书馆.我想从PostgreSQL数据库中检索数据.我得到的错误对我来说很奇怪.即使我手动配置CP:
val poolSettings = new ConnectionPoolSettings(initialSize = 100, maxSize = 100)
ConnectionPool.singleton("jdbc:postgresql://localhost:5432/test", "user", "pass", poolSettings)
Run Code Online (Sandbox Code Playgroud)
我仍然看到错误.这是我的DAO:
class CustomerDAO {
case class Customer(id: Long, firstname: String, lastname: String)
object Customer extends SQLSyntaxSupport[Customer]
val c = Customer.syntax("c")
def findById(id: Long)(implicit session: DBSession = Customer.autoSession) =
withSQL {
select.from(Customer as c)
}.map(
rs => Customer(
rs.int("id"),
rs.string("firstname"),
rs.string("lastname")
)
).single.apply()
}
Run Code Online (Sandbox Code Playgroud)
该应用程序:
object JdbcTest extends App {
val dao = new CustomerDAO
val res: Option[dao.Customer] = dao.findById(2)
}
Run Code Online (Sandbox Code Playgroud)
我的application.conf档案 …
任何人都可以给我一个示例,说明如何在具有动态值的 scalikejdbc 中使用 like 子句。我使用了以下查询,但没有用
sql"select * from tables_list where lower(TABLE_NAME) like '%$tableName.toLowerCase%'"
Run Code Online (Sandbox Code Playgroud) 我可以在ScalikeJDBC的SQL插值中使用in-clauses吗?例如
val ids = Set(1,2,3,5)
sql"""update foo set bar=${bar} where id in ${ids}""".update().apply()
Run Code Online (Sandbox Code Playgroud)
这是失败的,因为ids没有插值.
sql"""update foo set bar=${bar} where id in (${ids.mkString(",")})""".update().apply()
Run Code Online (Sandbox Code Playgroud)
这也会失败,因为表达式被解释为String,而不是数字列表.例如... where id in ('1,2,3,5')
我正在尝试将 PostgresRETURNING与 ScalikeJDBC一起使用(请参阅https://github.com/scalikejdbc/scalikejdbc/issues/559)
这如何与where子句一起使用。的returning(...)是其成员UpdateSQLBuilder,而where返回一个ConditionSQLBuilder
update(Post)
.set(sqls"${p.views}=${p.views}+${newViews}")
.where.eq(p.id,id)
.returning(p.id,p.lastUpdated, p.views) // does not work as it is not a member of ConditionSQLBuilder
Run Code Online (Sandbox Code Playgroud) scalikejdbc ×9
scala ×7
postgresql ×3
apache-spark ×1
arrays ×1
jsonb ×1
sbt ×1
sbt-plugin ×1
scala-macros ×1
sql ×1
sqlite ×1