Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite3";“忘记”;使用外键_Sql_Ruby_Sqlite_Raspbian - Fatal编程技术网

SQLite3";“忘记”;使用外键

SQLite3";“忘记”;使用外键,sql,ruby,sqlite,raspbian,Sql,Ruby,Sqlite,Raspbian,我将Ruby与SQLite3一起使用,但不幸的是,我在SQLite3中使用外键的尝试没有成功。根据sqlite3--version,安装了3.7.13版。据我所知,Sqlite3从3.6.x版开始就支持外键 我知道外键在默认情况下是禁用的,必须使用PRAGMA foreign\u keys=ON激活。在我的Ruby db创建脚本中,我做了如下操作: sql = <<-SQL PRAGMA foreign_keys = ON; CREATE TABLE apps ( i

我将Ruby与SQLite3一起使用,但不幸的是,我在SQLite3中使用外键的尝试没有成功。根据
sqlite3--version
,安装了3.7.13版。据我所知,Sqlite3从3.6.x版开始就支持外键

我知道外键在默认情况下是禁用的,必须使用
PRAGMA foreign\u keys=ON激活。在我的Ruby db创建脚本中,我做了如下操作:

sql = <<-SQL
  PRAGMA foreign_keys = ON;
  CREATE TABLE apps (
    id ....
  );
  CREATE TABLE requests (
    ...
    app_id INTEGER NOT NULL,
    FOREIGN KEY(app_id) REFERENCES apps(id),
  );
  ...
SQL
db.execute_batch(sql)

如果不退出sqlite3 shell,外键在激活它们(并且不退出shell)后会工作,并且不允许我插入具有未知应用程序ID的行。

我想我可以回答我自己的问题:文档中说:默认情况下禁用外键约束(为了向后兼容),因此必须分别为每个数据库连接启用。这很烦人,但它现在终于可以工作了。

将其放在执行SQL命令的文件的顶部,它将在运行时启用外键

db = SQLite3::Database.new("database.db")
db.execute("PRAGMA foreign_keys = ON")

默认情况下永久打开外键的一种方法是将以下行插入
~/.sqliterc

PRAGMA foreign_keys = ON;

请注意,它将影响您的所有数据库…

我想我可以回答我自己的问题(在评论中而不是回答,因为代表性低):文档说明:默认情况下禁用外键约束(为了向后兼容),因此必须分别为每个数据库连接启用。很烦人,但它现在终于可以工作了。相关问题:如果添加了违反外键约束的数据,并且随后将“外键”标志设置为“开”:这会导致错误吗?@MuhammadAdeel问题是,它只为用户启用外键。如果其他人们可能会使用你的应用程序,如果检查外键很重要,那么最好在建立连接的地方强制执行。我为我的flask应用程序尝试了这个方法,但没有成功。(是的,我重新启动了它,以此类推。)这只影响交互式客户端,因此对开发没有用处。此文件在ubuntu 18.04中似乎不存在。pragmas永远不会保存。除了那些明确用于设置文件元数据的文件外,它们始终只影响当前连接。
PRAGMA foreign_keys = ON;