aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2016-05-12 07:47:28 +0900
committerRyuta Kamizono <kamipo@gmail.com>2017-01-17 08:20:10 +0900
commit24f264e9ca0f1ce3b16392b8ee6360480251f556 (patch)
treec380ae4b91b78cf1aa3b13be7be40804d7eade87 /activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb
parentb0923e4ca2dcf9058421e14873304603586396f6 (diff)
downloadrails-24f264e9ca0f1ce3b16392b8ee6360480251f556.tar.gz
rails-24f264e9ca0f1ce3b16392b8ee6360480251f556.tar.bz2
rails-24f264e9ca0f1ce3b16392b8ee6360480251f556.zip
SQLite: Foreign Key Support
https://www.sqlite.org/foreignkeys.html
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb')
-rw-r--r--activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb25
1 files changed, 25 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb b/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb
index 2e3419991e..ca6de37a6b 100644
--- a/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb
@@ -130,6 +130,10 @@ module ActiveRecord
true
end
+ def supports_foreign_keys_in_create?
+ sqlite_version >= "3.6.19"
+ end
+
def supports_views?
true
end
@@ -439,6 +443,19 @@ module ActiveRecord
rename_column_indexes(table_name, column.name, new_column_name)
end
+ def foreign_keys(table_name)
+ fk_info = select_all("PRAGMA foreign_key_list(#{quote(table_name)})", "SCHEMA")
+ fk_info.map do |row|
+ options = {
+ column: row["from"],
+ primary_key: row["to"],
+ on_delete: extract_foreign_key_action(row["on_delete"]),
+ on_update: extract_foreign_key_action(row["on_update"])
+ }
+ ForeignKeyDefinition.new(table_name, row["table"], options)
+ end
+ end
+
private
def table_structure(table_name)
@@ -592,6 +609,14 @@ module ActiveRecord
SQLite3::TableDefinition.new(*args)
end
+ def extract_foreign_key_action(specifier)
+ case specifier
+ when "CASCADE"; :cascade
+ when "SET NULL"; :nullify
+ when "RESTRICT"; :restrict
+ end
+ end
+
def configure_connection
execute("PRAGMA foreign_keys = ON", "SCHEMA")
end