Rails3 SQLite3 DROP TABLE CASCADE错误

时间:2012-06-03 17:44:28

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

我在Rails 3.0.2上有一个项目。它相当大,并且与MySQL数据库配合良好。 但是当我尝试使用SQLite数据库运行它时,迁移期间出错:

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

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

如何在Rails3中为SQLite打开foreign_keys?

Gems版本

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

1 个答案:

答案 0 :(得分:0)

以下是SQLite's DROP TABLE的语法图:

enter image description here

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

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