123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::ConnectionAdapters::SQLite3Adapter

Overview

The SQLite3 adapter works SQLite 3.6.16 or newer with the sqlite3-ruby drivers (available as gem from rubygems.org/gems/sqlite3).

Options:

  • :database - Path to the database file.

Constant Summary

::ActiveSupport::Callbacks - Included

CALLBACK_FILTER_TYPES

AbstractAdapter - Inherited

ADAPTER_NAME, SIMPLE_INT

Class Attribute Summary

Class Method Summary

AbstractAdapter - Inherited

::ActiveSupport::DescendantsTracker - Inherited

clear, descendants, direct_descendants,
store_inherited

This is the only method that is not thread safe, but is only ever called during the eager loading phase.

Instance Attribute Summary

AbstractAdapter - Inherited

#__callbacks, #__callbacks?,
#active?

Checks whether the connection to the database is still active.

#in_use?
#lock, #logger, #owner, #pool, #prepared_statements,
#requires_reloading?

Returns true if its required to reload the connection between requests for development mode.

#schema_cache, #schema_cache=,
#supports_advisory_locks?

Does this adapter support application-enforced advisory locking?

#supports_bulk_alter?,
#supports_comments?

Does this adapter support metadata comments on database objects (tables, columns, indexes)?

#supports_comments_in_create?

Can comments for tables, columns, and indexes be specified in create/alter table statements?

#supports_datetime_with_precision?

Does this adapter support datetime with precision?

#supports_ddl_transactions?

Does this adapter support DDL rollbacks in transactions? That is, would CREATE TABLE or ALTER TABLE get rolled back by a transaction?

#supports_explain?

Does this adapter support explain?

#supports_expression_index?

Does this adapter support expression indices?

#supports_extensions?

Does this adapter support database extensions?

#supports_foreign_keys?

Does this adapter support creating foreign key constraints?

#supports_foreign_keys_in_create?

Does this adapter support creating foreign key constraints in the same statement as creating the table?

#supports_foreign_tables?

Does this adapter support foreign/external tables?

#supports_index_sort_order?

Does this adapter support index sort order?

#supports_indexes_in_create?

Does this adapter support creating indexes in the same statement as creating the table?

#supports_json?

Does this adapter support json data type?

#supports_multi_insert?

Does this adapter support multi-value insert?

#supports_partial_index?

Does this adapter support partial indices?

#supports_savepoints?

Does this adapter support savepoints?

#supports_transaction_isolation?

Does this adapter support setting the isolation level for a transaction?

#supports_validate_constraints?

Does this adapter support creating invalid constraints?

#supports_views?

Does this adapter support views?

#supports_virtual_columns?

Does this adapter support virtual columns?

#visitor

DatabaseStatements - Included

Instance Method Summary

AbstractAdapter - Inherited

#adapter_name

Returns the human-readable name of the adapter.

#clear_cache!

Clear any caching the database adapter may be doing, for example clearing the prepared statement cache.

#close

Check the connection back in to the connection pool.

#disable_extension

This is meant to be implemented by the adapters that support extensions.

#disable_referential_integrity

Override to turn off referential integrity while executing &block.

#discard!

Immediately forget this connection ever existed.

#disconnect!

Disconnects from the database if already connected.

#enable_extension

This is meant to be implemented by the adapters that support extensions.

#expire

this method must only be called while holding connection pool’s mutex.

#extensions

A list of extensions, to be filled in by adapters that support them.

#index_algorithms

A list of index algorithms, to be filled by adapters that support them.

#lease

this method must only be called while holding connection pool’s mutex.

#prefetch_primary_key?

Should primary key values be selected from their corresponding sequence before the insert statement? If true, next_sequence_value is called before each insert to set the record’s primary key.

#raw_connection

Provides access to the underlying database driver for this adapter.

#reconnect!

Disconnects from the database if already connected, and establishes a new connection with the database.

#reset!

Reset the state of this connection, directing the DBMS to clear transactions and other connection-related server-side state.

#unprepared_statement,
#verify!

Checks whether the connection to the database is still active (i.e. not stale).

#log

Savepoints - Included

DatabaseLimits - Included

#allowed_index_name_length

Returns the maximum allowed length for an index name.

#column_name_length

Returns the maximum length of a column name.

#columns_per_multicolumn_index

Returns the maximum number of columns in a multicolumn index.

#columns_per_table

Returns the maximum number of columns per table.

#in_clause_length

Returns the maximum number of elements in an IN (x,y,z) clause.

#index_name_length

Returns the maximum length of an index name.

#indexes_per_table

Returns the maximum number of indexes per table.

#joins_per_query

Returns maximum number of joins in a single query.

#sql_query_length

Returns the maximum length of an SQL query.

#table_alias_length

Returns the maximum length of a table alias.

#table_name_length

Returns the maximum length of a table name.

Quoting - Included

#quote

Quotes the column value to help prevent SQL injection attacks.

#quote_column_name

Quotes the column name.

#quote_string

Quotes a string, escaping any ‘ (single quote) and \ (backslash) characters.

#quote_table_name

Quotes the table name.

#quote_table_name_for_assignment

Override to return the quoted table name for assignment.

#quoted_date

Quote date/time values for use in SQL input.

#quoted_false, #quoted_true,
#type_cast

Cast a value to a type that the database understands.

#unquoted_false, #unquoted_true

DatabaseStatements - Included

#add_transaction_record

Register a record with the current transaction so that its after_commit and after_rollback callbacks can be called.

#begin_db_transaction

Begins the transaction (and turns off auto-committing).

#begin_isolated_db_transaction

Begins the transaction with the isolation level set.

#commit_db_transaction

Commits the transaction (and turns on auto-committing).

#create
#default_sequence_name,
#delete

Executes the delete statement and returns the number of rows affected.

#empty_insert_statement_value,
#exec_delete

Executes delete sql statement in the context of this connection using binds as the bind substitutes.

#exec_insert

Executes insert sql statement in the context of this connection using binds as the bind substitutes.

#exec_query

Executes sql statement in the context of this connection using binds as the bind substitutes.

#exec_update

Executes update sql statement in the context of this connection using binds as the bind substitutes.

#execute

Executes the SQL statement in the context of this connection and returns the raw result from the connection adapter.

#initialize,
#insert

Executes an INSERT query and returns the new record’s ID.

#insert_fixture

Inserts the given fixture into the table.

#insert_fixtures

Inserts a set of fixtures into the table.

#insert_fixtures_set,
#join_to_delete
#reset_sequence!

Set the sequence to the max value of the table’s column.

#rollback_db_transaction

Rolls back the transaction (and turns on auto-committing).

#rollback_to_savepoint,
#sanitize_limit

Sanitizes the given LIMIT parameter in order to prevent SQL injection.

#select_all

Returns an ::ActiveRecord::Result instance.

#select_one

Returns a record hash with the column names as keys and column values as values.

#select_rows

Returns an array of arrays containing the field values.

#select_value

Returns a single value from a record.

#select_values

Returns an array of the values of the first column in a select:

#to_sql

Converts an arel AST to SQL.

#transaction

Runs the given block in a database transaction, and returns the result of the block.

#transaction_isolation_levels, #transaction_state,
#truncate

Executes the truncate statement.

#update

Executes the update statement and returns the number of rows affected.

SchemaStatements - Included

#add_belongs_to
#add_column

Add a new type column named column_name to table_name.

#add_foreign_key

Adds a new foreign key.

#add_index

Adds a new index to the table.

#add_reference

Adds a reference.

#add_timestamps

Adds timestamps (created_at and updated_at) columns to table_name.

#assume_migrated_upto_version,
#change_column

Changes the column’s definition according to the new options.

#change_column_comment

Changes the comment for a column or removes it if nil.

#change_column_default

Sets a new default value for a column:

#change_column_null

Sets or removes a NOT NULL constraint on a column.

#change_table

A block for changing columns in table.

#change_table_comment

Changes the comment for a table or removes it if nil.

#column_exists?

Checks to see if a column exists in a given table.

#columns

Returns an array of Column objects for the table specified by table_name.

#create_join_table

Creates a new join table with the name created using the lexical order of the first two arguments.

#create_table

Creates a new table with the name table_name.

#data_source_exists?

Checks to see if the data source name exists on the database.

#data_sources

Returns the relation names useable to back Active Record models.

#drop_join_table

Drops the join table specified by the given arguments.

#drop_table

Drops a table from the database.

#foreign_key_exists?

Checks to see if a foreign key exists on a table for a given foreign key definition.

#foreign_keys

Returns an array of foreign keys for the given table.

#index_exists?

Checks to see if an index exists on a table for a given index definition.

#index_name_exists?

Verifies the existence of an index with a given name.

#indexes

Returns an array of indexes for the given table.

#native_database_types

Returns a hash of mappings from the abstract data types to the native database types.

#options_include_default?,
#primary_key

Returns just a table’s primary key.

#remove_belongs_to
#remove_column

Removes the column from the table definition.

#remove_columns

Removes the given columns from the table definition.

#remove_foreign_key

Removes the given foreign key from the table.

#remove_index

Removes the given index from the table.

#remove_reference

Removes the reference(s).

#remove_timestamps

Removes the timestamp columns (created_at and updated_at) from the table definition.

#rename_column

Renames a column.

#rename_index

Renames an index.

#rename_table

Renames a table.

#table_alias_for

Truncates a table alias according to the limits of the current adapter.

#table_comment

Returns the table comment that’s stored in database metadata.

#table_exists?

Checks to see if the table table_name exists on the database.

#table_options,
#tables

Returns an array of table names defined in the database.

#view_exists?

Checks to see if the view view_name exists on the database.

#views

Returns an array of view names defined in the database.

::ActiveSupport::Callbacks - Included

#run_callbacks

Runs the callbacks for the given event.

Constructor Details

.new(connection, logger, connection_options, config) ⇒ SQLite3Adapter

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 101

def initialize(connection, logger, connection_options, config)
  super(connection, logger, config)

  @active     = true
  @statements = StatementPool.new(self.class.type_cast_config_to_integer(config[:statement_limit]))

  configure_connection
end

Class Attribute Details

.represent_boolean_as_integer (rw)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 92

class_attribute :represent_boolean_as_integer, default: false

.represent_boolean_as_integer?Boolean (rw)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 92

class_attribute :represent_boolean_as_integer, default: false

Instance Attribute Details

#active?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 146

def active?
  @active
end

#represent_boolean_as_integer (rw)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 92

class_attribute :represent_boolean_as_integer, default: false

#represent_boolean_as_integer?Boolean (rw)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 92

class_attribute :represent_boolean_as_integer, default: false

#requires_reloading?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 122

def requires_reloading?
  true
end

#supports_datetime_with_precision?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 134

def supports_datetime_with_precision?
  true
end

#supports_ddl_transactions?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 110

def supports_ddl_transactions?
  true
end

#supports_explain?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 183

def supports_explain?
  true
end

#supports_foreign_keys_in_create?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 126

def supports_foreign_keys_in_create?
  sqlite_version >= "3.6.19"
end

#supports_index_sort_order?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 163

def supports_index_sort_order?
  true
end

#supports_json?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 138

def supports_json?
  true
end

#supports_multi_insert?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 142

def supports_multi_insert?
  sqlite_version >= "3.7.11"
end

#supports_partial_index?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 118

def supports_partial_index?
  sqlite_version >= "3.8.0"
end

#supports_savepoints?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 114

def supports_savepoints?
  true
end

#supports_views?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 130

def supports_views?
  true
end

Instance Method Details

#add_belongs_to(table_name, ref_name, **options)

Alias for #add_reference.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 354

alias :add_belongs_to :add_reference

#allowed_index_name_length

Returns 62. SQLite supports index names up to 64 characters. The rest is used by ::Rails internally to perform temporary rename operations

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 170

def allowed_index_name_length
  index_name_length - 2
end

#clear_cache!

Clears the prepared statements cache.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 159

def clear_cache!
  @statements.clear
end

#disconnect!

Disconnects from the database if already connected. Otherwise, this method does nothing.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 152

def disconnect!
  super
  @active = false
  @connection.close rescue nil
end

#encoding

Returns the current database encoding format as a string, eg: ‘UTF-8’

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 179

def encoding
  @connection.encoding.to_s
end

#exec_delete(sql, name = "SQL", binds = []) Also known as: #exec_update

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 242

def exec_delete(sql, name = "SQL", binds = [])
  exec_query(sql, name, binds)
  @connection.changes
end

#exec_query(sql, name = nil, binds = [], prepare: false)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 209

def exec_query(sql, name = nil, binds = [], prepare: false)
  type_casted_binds = type_casted_binds(binds)

  log(sql, name, binds, type_casted_binds) do
    ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
      # Don't cache statements if they are not prepared
      unless prepare
        stmt = @connection.prepare(sql)
        begin
          cols = stmt.columns
          unless without_prepared_statement?(binds)
            stmt.bind_params(type_casted_binds)
          end
          records = stmt.to_a
        ensure
          stmt.close
        end
      else
        cache = @statements[sql] ||= {
          stmt: @connection.prepare(sql)
        }
        stmt = cache[:stmt]
        cols = cache[:cols] ||= stmt.columns
        stmt.reset!
        stmt.bind_params(type_casted_binds)
        records = stmt.to_a
      end

      ActiveRecord::Result.new(cols, records)
    end
  end
end

#exec_update(sql, name = "SQL", binds = [])

Alias for #exec_delete.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 246

alias :exec_update :exec_delete

#explain(arel, binds = [])

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 204

def explain(arel, binds = [])
  sql = "EXPLAIN QUERY PLAN #{to_sql(arel, binds)}"
  SQLite3::ExplainPrettyPrinter.new.pp(exec_query(sql, "EXPLAIN", []))
end

#foreign_keys(table_name)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 356

def foreign_keys(table_name)
  fk_info = exec_query("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

#insert_fixtures(rows, table_name)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 369

def insert_fixtures(rows, table_name)
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
    `insert_fixtures` is deprecated and will be removed in the next version of Rails.
    Consider using `insert_fixtures_set` for performance improvement.
  MSG
  insert_fixtures_set(table_name => rows)
end

#insert_fixtures_set(fixture_set, tables_to_delete = [])

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 377

def insert_fixtures_set(fixture_set, tables_to_delete = [])
  disable_referential_integrity do
    transaction(requires_new: true) do
      tables_to_delete.each { |table| delete "DELETE FROM #{quote_table_name(table)}", "Fixture Delete" }

      fixture_set.each do |table_name, rows|
        rows.each { |row| insert_fixture(row, table_name) }
      end
    end
  end
end

#last_inserted_id(result)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 248

def last_inserted_id(result)
  @connection.last_insert_row_id
end

#rename_table(table_name, new_name)

Renames a table.

Example:

rename_table('octopuses', 'octopi')
[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 288

def rename_table(table_name, new_name)
  exec_query "ALTER TABLE #{quote_table_name(table_name)} RENAME TO #{quote_table_name(new_name)}"
  rename_table_indexes(table_name, new_name)
end

#valid_alter_table_type?(type, options = {}) ⇒ Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 293

def valid_alter_table_type?(type, options = {})
  !invalid_alter_table_type?(type, options)
end