当前位置: 首页 > 知识库问答 >
问题:

Slick 3-不生成ForeignKeys

彭宏义
2023-03-14

我似乎找不到解决这个奇怪的错误的方法:

class Names(tag: Tag) extends Table[Name](tag, "NAME") with Identifiable[Name]{
  def firstName = column[String]("firstName")
  def lastName = column[String]("lastName")
  def profileId = column[Int]("profileId")
  def * = (id.?, firstName, lastName, profileId) <> ((Name.apply _).tupled, Name.unapply)
  def profileFk = foreignKey("profile_fk", profileId, TableQuery[Profiles])(_.id, onDelete=ForeignKeyAction.Cascade)
}

class PhoneNumbers(tag: Tag) extends Table[PhoneNumber](tag, "PHONENUMBER") with Identifiable[PhoneNumber] {
  def number = column[String]("number")
  def kind = column[String]("kind")
  def profileId = column[Int]("profileId")
  def * = (id.?, number, kind, profileId) <> ((PhoneNumber.apply _).tupled, PhoneNumber.unapply)
  def profileFk = foreignKey("profile_fk", profileId, TableQuery[Profiles])(_.id, onDelete=ForeignKeyAction.Cascade)
}

而profile类仅由id字段组成。Identiable提供ID属性。

我将Slick 3与MySQL一起使用。

对于名称,生成配置文件的foreignKey,而对于PhoneNumbers则不生成。为什么?好像没什么区别?

更新:

在此相关声明:

create table `PHONENUMBER` (`id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,`number` TEXT NOT NULL,`kind` TEXT NOT NULL,`profileId` INTEGER NOT NULL)

和:

alter table `PHONENUMBER` add constraint `profile_fk` foreign key(`profileId`) references `PROFILE`(`id`) on update NO ACTION on delete CASCADE

完整输出:

创建表profile(idINTEGER NOT NULL AUTO_INCREMENT主键,useridINTEGER NOT NULL)

创建表version(idINTEGER NOT NULL AUTO_INCREMENT主键,timestampINTEGER NOT NULL,vectorINTEGER NOT NULL)

创建表name(idINTEGER NOT NULL AUTO_INCREMENT主键,firstnameTEXT NOT NULL,lastnameTEXT NOT NULL,profileidINTEGER NOT NULL,versionidINTEGER NOT NULL)

创建表phoneNumber(idINTEGER NOT NULL AUTO_INCREMENT主键、number文本NOT NULL、kind文本NOT NULL、profileidINTEGER NOT NULL、versionidINTEGER NOT NULL)

创建表视图(id整数不为空AUTO_INCREMENT主键)创建表phoneNumbers_views(phoneNumber整数不为空,视图整数不为空)

创建表凭据(ID整数不为空AUTO_INCREMENT主键、username文本不为空、密码文本不为空、userid整数不为空)

创建表用户(id整数不为NULL AUTO_INCREMENT主键)

创建表api_key(idINTEGER NOT NULL AUTO_INCREMENT主键,token文本NOT NULL,deviceid文本NOT NULL,credentialsidINTEGER NOT NULL)

alter tableprofileadd constraintuser_fk外键(userid)引用user(id)对更新没有操作对删除没有操作

更改表name添加约束profile_fk外键(profileID)引用profile(ID)更新时删除级联时不执行操作

更改表name添加约束version_fk外键(versionID)引用version(ID)更新时无操作删除时无操作

更改表phoneNumber添加约束profile_fk外键(profileID)引用profile(ID)更新时删除级联时不执行操作

更改表phoneNumber添加约束version_fk外键(versionID)引用version(ID)更新时无操作删除时无操作

alter tablephoneNumbers_views添加约束phoneNumber_fk外键(phoneNumber)在更新时引用phoneNumber(id)在删除时没有操作alter tablephoneNumber(view_fk添加约束外键(view)在更新时引用view(view)在删除时没有

更改表credential添加约束user_fk外键(userid)引用user(id)更新时无操作删除时无操作

alter tableapi_key添加约束credentials_fk外键(credentialsid)引用credential(id)更新没有操作删除没有操作

`symbol由于markdown而被隐藏,但在原始输出中

编辑2:

val profiles = TableQuery[Profiles]
val names = TableQuery[Names]
val phoneNumbers = TableQuery[PhoneNumbers]
val views = TableQuery[Views]
val phoneNumbersToViews = TableQuery[PhoneNumbersToViews]
val users = TableQuery[Users]
val credentials = TableQuery[CredentialsSchema]
val apiKeys = TableQuery[ApiKeys]
val versions = TableQuery[Versions]

val schema = profiles.schema ++
  versions.schema ++
  names.schema ++
  phoneNumbers.schema ++
  views.schema ++
  phoneNumbersToViews.schema ++
  credentials.schema ++
  users.schema ++
  apiKeys.schema

SlickDB().run(DBIO.seq(
  schema.create
))

schema.createStatements.foreach(println)

共有1个答案

曹凯泽
2023-03-14

“对于名称生成配置文件的foreignKey,而对于PhoneNumbers则不生成。为什么?似乎没有区别?”

我认为缺乏差异是这里的问题所在。

您对names.profilefkphoneNumbers.profilefk使用了相同的外键名称(“profile_fk”)。MySQL外键名称必须是唯一的。

我建议将“profile_fk”替换为“name_profile_fk”和“phoneNumber_profile_fk”。

但是,您应该看到一个例外。您包含的第一条alter table语句...

alter table NAME add constraint profile_fk foreign key(profileId) references PROFILE(id) on update NO ACTION on delete CASCADE

...应该没问题,但第二个...

alter table PHONENUMBER add constraint profile_fk foreign key(profileId) references PROFILE(id) on update NO ACTION on delete CASCADE

...是应该有例外的地方。

如果您没有看到异常,可能是您的应用程序在您执行的将来返回之前终止了。您可以通过在slickdb().run命令周围放置一个await来测试这一点。例如,

import scala.concurrent.Await
import scala.concurrent.duration._
Await.result(
  SlickDB().run(DBIO.seq(schema.create))
  , 10 seconds)
 类似资料:
  • 我试图建立APK,以张贴我的请求在离子在游戏商店。但是当涉及到下面的命令时,我得到了错误: PS c:\projetos\xxx>jarsigner-verbose-sigalg sha1withrsa-digestalg sha1-keystore android.keystore platforms/android/app/build/outputs/apk/release/app-relea

  • 我正在学习LiquiBase。我正在尝试从changelog生成SQL。出于某种原因,它生成的唯一SQL是对表的锁定。 我期待drop、create和update表的SQL,但没有看到任何东西。 LiquiBase:3.4.1版 数据库:MS SQL Server

  • 问题内容: 我正在尝试将jOOQ包含在我的代码中,但是未生成任何代码。 执行时,不会生成任何源。我希望它创建一个在以下-file文件中定义的类。 我的pom.xml文件如下所示: 我假设应该使用适当的类来创建目录。Maven构建成功运行,没有任何错误。 您可以在此GitHub存储库中找到整个项目。 问题答案: 您正在使用内存数据库:。jOOQ代码生成器启动时,它将接收到一个空的 新 数据库,而不是

  • 我正在用Gradle编写一个构建文件来执行Java构建操作。然而,Gradle并没有为我的项目生成Javadocs。格拉德尔说。org的文档,要在Gradle中实现Javadocs任务,必须指定源和类路径。 但是,当我运行命令或时,javadocs的默认文件夹(build\docs)永远不会创建,因此不会为项目生成html文件。我能做些什么来解决这个问题?

  • 我正在尝试使用ANTLRV4为一个简单的自定义语法生成一个lexer和解析器。问题是,当我运行Antlr.jar实用程序时,它生成了一个Lexer文件,而不是一个解析器文件,我认为它应该生成。 简单语法 hellolexer.js hellolexer.tokens 所需输出 hellolexer.js helloparser.js hellolistener.js hellovisitor.js

  • 当我尝试运行“ php artisan key:generate ” 时,我在提示中收到以下错误错误屏幕截图实际上我正在不同的笔记本电脑上运行一个 laravel 项目。我在生成密钥时遇到此问题。我该如何解决?