【问题标题】:Rails3 SQLite3 DROP TABLE CASCADE errorRails3 SQLite3 DROP TABLE CASCADE 错误
【发布时间】:2012-06-04 02:47:29
【问题描述】:

我有一个关于 Rails 3.0.2 的项目。它相当大并且与 MySQL 数据库配合得很好。 但是当我尝试使用 SQLite 数据库运行它时,迁移过程中出现错误:

SQLite3::SQLException: near "CASCADE": syntax error: DROP TABLE "table_name" CASCADE

我搜索并发现可能'PRAGMA foreign_keys = ON' for SQLite 会有所帮助。 因此,我尝试在 'DROP TABLE table_name' 之前的迁移中添加 'execute("PRAGMA foreign_keys = ON")' 但这没有帮助。

如何在 Rails3 中为 SQLite 打开 foreign_keys?

宝石版本

  • sqlite3 (1.3.6)
  • sqlite3-ruby (1.3.3)

【问题讨论】:

    标签: ruby-on-rails-3 sqlite foreign-keys cascade


    【解决方案1】:

    这是SQLite's DROP TABLE的语法图:

    如果图像移动,语法如下:

    drop table if exists db_name.table_name
    

    if existsdb_name. 部分是可选的。那里没有 CASCADE,因此 SQLite 在使用 DROP TABLE 时根本不支持 CASCADE,并且您无法添加它(当然,除非您想破解 SQLite C 源代码并自己添加它)。使用 SQLite 时必须接受某些限制,这就是其中之一。

    如果您想为 SQLite 和 MySQL 使用一个迁移,那么您必须检查正在使用哪个数据库并执行适当的 SQL 或找到在任何地方都可以使用的东西(即手动执行 CASCADE)。我现在能想到的检查您正在使用的数据库的简单方法是:

    case connection
    when ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
        # PostgreSQL things go here
    when ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
        # MySQL things go here
    when ActiveRecord::ConnectionAdapters::SQLiteAdapter
        # SQLite things go here
    ...
    end
    

    【讨论】:

      猜你喜欢
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多