Slick 2 中的多个 PostgreSQL 数据库(同一服务器)访问

Posted

技术标签:

【中文标题】Slick 2 中的多个 PostgreSQL 数据库(同一服务器)访问【英文标题】:Multiple PostgreSQL database (same server) access in Slick 2 【发布时间】:2014-03-16 15:09:47 【问题描述】:

所以我有一个使用多个 mysql 和 PostgreSQL 数据库(在同一台服务器上)的 Scala/Play 应用程序,但是我遇到了 PostgreSQL 的问题。

这是配置:

db.postgres.driver=org.postgresql.Driver
db.postgres.url="jdbc:postgresql://localhost:5432/"
db.postgres.user=root
db.postgres.password=root

db.mysql.driver="com.mysql.jdbc.Driver"
db.mysql.url="jdbc:mysql://localhost"
db.mysql.user=root
db.mysql.pass=root

这个简单的方法适用于 MySQL:

def test = DB("mysql").withDynSession 
    val rez = sql"""select * from dbName.test""".as[TestRow].list
    println(rez)

但与 Postgres 的方法完全相同

def test = DB("postgres").withDynSession 
    val rez = sql"""select * from dbName.test""".as[TestRow].list
    println(rez)

抛出错误:

org.postgresql.util.PSQLException: ERROR: relation "dbName.test" does not exist

为什么这些方法是相同的,但 MySQL 示例有效而 PostgreSQL 无效?

我的堆栈:

Scala 2.10.3 播放 2.2.2 光滑 2.0 PostgreSQL 9.3.3 MySQL 5.6.16 Java 8

Postgresql JDBC 驱动版本为 9.3-1101-jdbc41

【问题讨论】:

您是否验证通过 psql 运行该查询可以正确返回结果?也许您提供的语法无效,或者您期望的架构真的不存在? @JasonPearson 我开始意识到这种方法在 Postgres 中可能是不可能的,因为你只能连接到一个特定的数据库,所以你不能用数据库名称为表添加前缀。我可能是错的,但从我目前的发现来看,它指向了这个结论。 【参考方案1】:

我遇到了同样的问题。

我正在使用具有提升嵌入功能的 Slick 2.0 和 PostgreSQL 9.3。

您必须在定义表时设置架构:

类咖啡(标签:标签) extends Table[(String, Int, Double, Int, Int)](tag, Some("MYSCHEMA"), "COFFEES")

文档: http://slick.typesafe.com/doc/2.0.1/schemas.html

【讨论】:

【参考方案2】:

这可能是区分大小写的问题。尝试引用名称并将架构添加到限定名称:sql"""select * from "dbName"."theSchema"."test"""" 这有帮助吗?

【讨论】:

我试过了,错误根本没有改变。我开始认为这在 postgres 中可能根本不可能? 也许您需要将架构添加到限定路径。另见postgresql.org/docs/9.1/static/… 和***.com/questions/7942520/…

以上是关于Slick 2 中的多个 PostgreSQL 数据库(同一服务器)访问的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework 2.6 中未触发 Slick (postgresql) 演变

删除不适用于 Play! 2.4、Slick 3 和 PostgreSQL

Play 2.4 中的 Slick 3.0 事务

如何在 Slick 2.0 中计数(*)?

Play 2.4 Slick 3.0 - 删除表中的所有行

在 PostgreSQL 和 Slick 中使用自动递增字段