Class: ActiveRecord::ConnectionAdapters::SQLite3Adapter
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
|
|
Instance Chain:
|
|
Inherits: |
ActiveRecord::ConnectionAdapters::AbstractAdapter
|
Defined in: | activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb |
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
-
ADAPTER_NAME =
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 57"SQLite".freeze
-
COLLATE_REGEX =
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 511/.*\"(\w)\".*collate\s\"(\w+)\".*/i.freeze
-
NATIVE_DATABASE_TYPES =
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 62{ primary_key: "integer PRIMARY KEY AUTOINCREMENT NOT NULL", string: { name: "varchar" }, text: { name: "text" }, integer: { name: "integer" }, float: { name: "float" }, decimal: { name: "decimal" }, datetime: { name: "datetime" }, time: { name: "time" }, date: { name: "date" }, binary: { name: "blob" }, boolean: { name: "boolean" }, json: { name: "json" }, }
::ActiveSupport::Callbacks
- Included
AbstractAdapter
- Inherited
Class Attribute Summary
AbstractAdapter
- Inherited
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
- #active? ⇒ Boolean readonly
- #represent_boolean_as_integer rw
- #represent_boolean_as_integer? ⇒ Boolean rw
- #requires_reloading? ⇒ Boolean readonly
- #supports_datetime_with_precision? ⇒ Boolean readonly
- #supports_ddl_transactions? ⇒ Boolean readonly
- #supports_explain? ⇒ Boolean readonly
- #supports_foreign_keys_in_create? ⇒ Boolean readonly
- #supports_index_sort_order? ⇒ Boolean readonly
- #supports_json? ⇒ Boolean readonly
- #supports_multi_insert? ⇒ Boolean readonly
- #supports_partial_index? ⇒ Boolean readonly
- #supports_savepoints? ⇒ Boolean readonly
- #supports_views? ⇒ Boolean readonly
AbstractAdapter
- Inherited
#__callbacks, #__callbacks?, | |
#active? | Checks whether the connection to the database is still active. |
#in_use? | Alias for AbstractAdapter#owner. |
#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
-
#add_belongs_to(table_name, ref_name, **options)
Alias for #add_reference.
-
#allowed_index_name_length
Returns 62.
-
#clear_cache!
Clears the prepared statements cache.
-
#disconnect!
Disconnects from the database if already connected.
-
#encoding
Returns the current database encoding format as a string, eg: ‘UTF-8’.
- #exec_delete(sql, name = "SQL", binds = []) (also: #exec_update)
- #exec_query(sql, name = nil, binds = [], prepare: false)
-
#exec_update(sql, name = "SQL", binds = [])
Alias for #exec_delete.
- #explain(arel, binds = [])
- #foreign_keys(table_name)
- #insert_fixtures(rows, table_name)
- #insert_fixtures_set(fixture_set, tables_to_delete = [])
- #last_inserted_id(result)
-
#rename_table(table_name, new_name)
Renames a table.
- #valid_alter_table_type?(type, options = {}) ⇒ Boolean
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 |
#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 |
#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 | Alias for DatabaseStatements#insert. |
#default_sequence_name, | |
#delete | Executes the delete statement and returns the number of rows affected. |
#empty_insert_statement_value, | |
#exec_delete | Executes delete |
#exec_insert | Executes insert |
#exec_query | Executes |
#exec_update | Executes update |
#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 | Alias for DatabaseStatements#join_to_update. |
#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 |
#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 | Alias for SchemaStatements#add_reference. |
#add_column | Add a new |
#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 ( |
#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 |
#change_column_default | Sets a new default value for a column: |
#change_column_null | Sets or removes a |
#change_table | A block for changing columns in |
#change_table_comment | Changes the comment for a table or removes it if |
#column_exists? | Checks to see if a column exists in a given table. |
#columns | Returns an array of |
#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 |
#data_source_exists? | Checks to see if the data source |
#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 | Alias for SchemaStatements#remove_reference. |
#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 ( |
#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_options, | |
#tables | Returns an array of table names defined in the database. |
#view_exists? | Checks to see if the view |
#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
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 101
def initialize(connection, logger, , 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.
# 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
# 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.
# 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.
# 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’
# 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.
# 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| = { 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"], ) 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')
# 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
# File 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb', line 293
def valid_alter_table_type?(type, = {}) !invalid_alter_table_type?(type, ) end