diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2016-06-21 08:39:05 +0900 |
---|---|---|
committer | Ryuta Kamizono <kamipo@gmail.com> | 2017-01-16 22:44:35 +0900 |
commit | 974f5fbbc2cc473541492bcd21c4128cbfa276a1 (patch) | |
tree | c13fe06331117ec72767927d73fcd798e75e297b /activerecord/lib/active_record/connection_adapters | |
parent | f5d66cb3e5fc48c89c41c522804b70f3e5fcbc47 (diff) | |
download | rails-974f5fbbc2cc473541492bcd21c4128cbfa276a1.tar.gz rails-974f5fbbc2cc473541492bcd21c4128cbfa276a1.tar.bz2 rails-974f5fbbc2cc473541492bcd21c4128cbfa276a1.zip |
Translate Foreign Key violation to the specific exception for SQLite3 adapter
Raise `ActiveRecord::InvalidForeignKey` when a record cannot be inserted
or updated because it references a non-existent record for SQLite3
adapter.
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb | 21 |
1 files changed, 21 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 ec44d020c2..2e3419991e 100644 --- a/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb @@ -95,6 +95,8 @@ module ActiveRecord @active = nil @statements = StatementPool.new(self.class.type_cast_config_to_integer(config[:statement_limit])) + + configure_connection end def supports_ddl_transactions? @@ -185,6 +187,19 @@ module ActiveRecord true end + # REFERENTIAL INTEGRITY ==================================== + + def disable_referential_integrity # :nodoc: + old = select_value("PRAGMA foreign_keys") + + begin + execute("PRAGMA foreign_keys = OFF") + yield + ensure + execute("PRAGMA foreign_keys = #{old}") + end + end + #-- # DATABASE STATEMENTS ====================================== #++ @@ -525,6 +540,8 @@ module ActiveRecord RecordNotUnique.new(message) when /.* may not be NULL/, /NOT NULL constraint failed: .*/ NotNullViolation.new(message) + when /FOREIGN KEY constraint failed/i + InvalidForeignKey.new(message) else super end @@ -574,6 +591,10 @@ module ActiveRecord def create_table_definition(*args) SQLite3::TableDefinition.new(*args) end + + def configure_connection + execute("PRAGMA foreign_keys = ON", "SCHEMA") + end end end end |