如何在没有双引号的情况下生成光滑的查询?
Posted
技术标签:
【中文标题】如何在没有双引号的情况下生成光滑的查询?【英文标题】:How can I have slick generates query without double quotes? 【发布时间】:2015-12-09 18:23:37 【问题描述】:我正在尝试使用 Slick 与 Oracle DB 进行交互。映射为:
trait EntityTable extends DataBaseConfig
import driver.api._
class Log(tag: Tag) extends Table[LogEntity](tag,"LOG_SCHEMA.A_TABLE_WITH_VERY_LONG_NAME")
def id = column[Option[Long]]("LOG_ID",O.PrimaryKey,O.AutoInc)
def log = column[String]("LOG_TEXT")
def * = (LOG_ID, LOG_TEXT) <> ((LogEntity.apply _).tupled, LogEntity.unapply)
protected val getLogs = TableQuery[Log]
从调试器中我看到生成的 SQL 是:
select "LOG_ID", "LOG_TEXT" from "LOG_SCHEMA.A_TABLE_WITH_VERY_LONG_NAME"
这给了我一个
ORA-00972: identifier is too long
还是有更好的方法来处理我无法控制的不同方案中的长表名?谢谢!
【问题讨论】:
【参考方案1】:在 Oracle 中,名称(表、索引、视图)的长度不能超过 30 个字符。在你的例子中,我猜你有一个错误,而不是
"LOG_SCHEMA.A_TABLE_WITH_VERY_LONG_NAME"
试试这个:
"""LOG_SCHEMA"."A_TABLE_WITH_VERY_LONG_NAME"""
或者这个:
"\"LOG_SCHEMA\".\"A_TABLE_WITH_VERY_LONG_NAME\""
不管表是如何创建的,A_TABLE_WITH_VERY_LONG_NAME 不能超过 30 个字符。
【讨论】:
我使用了"""LOG_SCHEMA"."A_TABLE_WITH_VERY_LONG_NAME""",它生成了"select "LOG_ID", "LOG_TEXT" from "LOG_SCHEMA""。""A_TABLE_WITH_VERY_LONG_NAME"" “\"LOG_SCHEMA\".\"A_TABLE_WITH_VERY_LONG_NAME\"" 怎么样? 另一种选择是使用 LOG_SCHEMA 用户名连接到数据库,而您可以只使用“A_TABLE_WITH_VERY_LONG_NAME”,在这种情况下,您不必使用 schema_name 限定 table_name,或者为 LOG_SCHEMA.A_TABLE_WITH_VERY_LONG_NAME 创建一个 sysnonim 使用 "\"LOG_SCHEMA\".\"A_TABLE_WITH_VERY_LONG_NAME\"" ,它会产生 """LOG_SCHEMA"".""A_TABLE_WITH_VERY_LONG_NAME"""。我无法控制最初提到的 LOG_SCHEMA 用户名。以上是关于如何在没有双引号的情况下生成光滑的查询?的主要内容,如果未能解决你的问题,请参考以下文章