Skip to content

Commit 6b446be

Browse files
byrootintrip
andcommitted
Remove SQLite production warning but leave production config disabled
There are valid use cases for running SQLite in production, however it must be done with care, so instead of a warning most users won't see anyway, it's preferable to leave the configuration commented out to force them to think about having the database on a persistent volume etc. Co-Authored-By: Jacopo Beschi <[email protected]>
1 parent 5b62994 commit 6b446be

File tree

7 files changed

+25
-83
lines changed

7 files changed

+25
-83
lines changed

.github/workflows/rails-new-docker.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ jobs:
3333
podman run --name $APP_NAME \
3434
-v $(pwd):$(pwd) \
3535
-e SECRET_KEY_BASE_DUMMY=1 \
36+
-e DATABASE_URL=sqlite3:storage/production.sqlite3 \
3637
-p 3000:3000 $APP_NAME &
3738
- name: Test container
3839
run: ruby -r ./.github/workflows/scripts/test-container.rb

activerecord/CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
* Remove warning message when running SQLite in production, but leave it unconfigured
2+
3+
There are valid use cases for running SQLite in production, however it must be done
4+
with care, so instead of a warning most users won't see anyway, it's preferable to
5+
leave the configuration commented out to force them to think about having the database
6+
on a persistent volume etc.
7+
8+
*Jacopo Beschi*, *Jean Boussier*
9+
110
* Add support for generated columns in SQLite3 adapter
211

312
Generated columns (both stored and dynamic) are supported since version 3.31.0 of SQLite.

activerecord/lib/active_record/railtie.rb

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ class Railtie < Rails::Railtie # :nodoc:
3131
config.active_record.check_schema_cache_dump_version = true
3232
config.active_record.maintain_test_schema = true
3333
config.active_record.has_many_inversing = false
34-
config.active_record.sqlite3_production_warning = true
3534
config.active_record.query_log_tags_enabled = false
3635
config.active_record.query_log_tags = [ :application ]
3736
config.active_record.query_log_tags_format = :legacy
@@ -232,13 +231,13 @@ class Railtie < Rails::Railtie # :nodoc:
232231
end
233232
end
234233

235-
SQLITE3_PRODUCTION_WARN = "You are running SQLite in production, this is generally not recommended."\
236-
" You can disable this warning by setting \"config.active_record.sqlite3_production_warning=false\"."
237-
initializer "active_record.sqlite3_production_warning" do
238-
if config.active_record.sqlite3_production_warning && Rails.env.production?
239-
ActiveSupport.on_load(:active_record_sqlite3adapter) do
240-
Rails.logger.warn(SQLITE3_PRODUCTION_WARN)
241-
end
234+
initializer "active_record.sqlite3_deprecated_warning" do
235+
if config.active_record.key?(:sqlite3_production_warning)
236+
config.active_record.delete(:sqlite3_production_warning)
237+
ActiveRecord.deprecator.warn <<~MSG.squish
238+
The `config.active_record.sqlite3_production_warning` configuration no longer has any effect
239+
and can be safely removed.
240+
MSG
242241
end
243242
end
244243

@@ -278,7 +277,6 @@ class Railtie < Rails::Railtie # :nodoc:
278277
:query_log_tags,
279278
:query_log_tags_format,
280279
:cache_query_log_tags,
281-
:sqlite3_production_warning,
282280
:sqlite3_adapter_strict_strings_by_default,
283281
:check_schema_cache_dump_version,
284282
:use_schema_cache_dump

railties/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ test:
2020
<<: *default
2121
database: storage/test.sqlite3
2222

23+
24+
# SQLite3 write its data on the local filesystem, as such it requires
25+
# persistent disks. If you are deploying to a managed service, you should
26+
# make sure it provides disk persistence, as many don't.
27+
#
28+
# Similarly, if you deploy your application as a Docker container, you must
29+
# ensure the database is located in a persisted volume.
2330
production:
2431
<<: *default
25-
database: storage/production.sqlite3
32+
# database: path/to/persistent/storage/production.sqlite3

railties/test/application/configuration_test.rb

Lines changed: 0 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,6 @@ def self.safe_list_sanitizer
3131
end
3232
end
3333

34-
class MyLogRecorder < Logger
35-
def initialize
36-
@io = StringIO.new
37-
super(@io)
38-
end
39-
40-
def recording
41-
@io.string
42-
end
43-
end
44-
4534
module ApplicationTests
4635
class ConfigurationTest < ActiveSupport::TestCase
4736
include ActiveSupport::Testing::Isolation
@@ -79,7 +68,6 @@ def switch_development_hosts_to(*hosts)
7968
def setup
8069
build_app
8170
suppress_default_config
82-
suppress_sqlite3_warning
8371
end
8472

8573
def teardown
@@ -96,14 +84,6 @@ def restore_default_config
9684
FileUtils.mv("#{app_path}/config/__environments__", "#{app_path}/config/environments")
9785
end
9886

99-
def suppress_sqlite3_warning
100-
add_to_config "config.active_record.sqlite3_production_warning = false"
101-
end
102-
103-
def restore_sqlite3_warning
104-
remove_from_config ".*config.active_record.sqlite3_production_warning.*\n"
105-
end
106-
10787
test "Rails.env does not set the RAILS_ENV environment variable which would leak out into rake tasks" do
10888
require "rails"
10989

@@ -4061,57 +4041,6 @@ class Post < ActiveRecord::Base
40614041
assert_equal false, Rails.application.env_config["action_dispatch.log_rescued_responses"]
40624042
end
40634043

4064-
test "logs a warning when running SQLite3 in production" do
4065-
restore_sqlite3_warning
4066-
app_file "config/initializers/active_record.rb", <<~RUBY
4067-
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
4068-
RUBY
4069-
add_to_config "config.logger = MyLogRecorder.new"
4070-
4071-
app "production"
4072-
4073-
assert_match(/You are running SQLite in production, this is generally not recommended/, Rails.logger.recording)
4074-
end
4075-
4076-
test "doesn't log a warning when running SQLite3 in production and sqlite3_production_warning=false" do
4077-
app_file "config/initializers/active_record.rb", <<~RUBY
4078-
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
4079-
RUBY
4080-
add_to_config "config.logger = MyLogRecorder.new"
4081-
4082-
app "production"
4083-
4084-
assert_no_match(/You are running SQLite in production, this is generally not recommended/, Rails.logger.recording)
4085-
end
4086-
4087-
test "doesn't log a warning when running MySQL in production" do
4088-
restore_sqlite3_warning
4089-
original_configurations = ActiveRecord::Base.configurations
4090-
ActiveRecord::Base.configurations = { production: { db1: { adapter: "mysql2" } } }
4091-
app_file "config/initializers/active_record.rb", <<~RUBY
4092-
ActiveRecord::Base.establish_connection(adapter: "mysql2")
4093-
RUBY
4094-
add_to_config "config.logger = MyLogRecorder.new"
4095-
4096-
app "production"
4097-
4098-
assert_no_match(/You are running SQLite in production, this is generally not recommended/, Rails.logger.recording)
4099-
ensure
4100-
ActiveRecord::Base.configurations = original_configurations
4101-
end
4102-
4103-
test "doesn't log a warning when running SQLite3 in development" do
4104-
restore_sqlite3_warning
4105-
app_file "config/initializers/active_record.rb", <<~RUBY
4106-
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
4107-
RUBY
4108-
add_to_config "config.logger = MyLogRecorder.new"
4109-
4110-
app "development"
4111-
4112-
assert_no_match(/You are running SQLite in production, this is generally not recommended/, Rails.logger.recording)
4113-
end
4114-
41154044
test "app starts with LocalCache middleware" do
41164045
app "development"
41174046

railties/test/application/loading_test.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,6 @@ def test_initialize_can_be_called_at_any_time
418418
end
419419

420420
test "active record query cache hooks are installed before first request in production" do
421-
add_to_config "config.active_record.sqlite3_production_warning = false"
422421
app_file "app/controllers/omg_controller.rb", <<-RUBY
423422
begin
424423
class OmgController < ActionController::Metal

railties/test/application/query_logs_test.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ class QueryLogsTest < ActiveSupport::TestCase
1010

1111
def setup
1212
build_app(multi_db: true)
13-
add_to_config "config.active_record.sqlite3_production_warning = false"
1413
rails("generate", "scaffold", "Pet", "name:string", "--database=animals")
1514
app_file "app/models/user.rb", <<-RUBY
1615
class User < ActiveRecord::Base

0 commit comments

Comments
 (0)