Hello,
I’m trying to transition to the Rails 8 “solid” approach, using sqlite3 to manage caching, queues, and cable, while sticking to my existing primary pg database.
I’ve just upgraded my existing app in dev to Rails 8 from 7.1, and removed the existing queue/cache/cable stores. I have the associated db/<service>_schema.rb
file as outlined in each repo’s README, however when I run tests I receive errors as the schema tries to create.
Does anyone know if there’s some config piece I’m missing?
There error I’m getting is that it’s looking for a postgres table on sqlite
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: pg_proc (ActiveRecord::StatementInvalid)
Here’s the full thing
Dropped database 'rstar_test'
Dropped database 'storage/test_errors.sqlite3'
Dropped database 'storage/test_queue.sqlite3'
Created database 'rstar_test'
Created database 'storage/test_errors.sqlite3'
Created database 'storage/test_queue.sqlite3'
Rebuilding...
rake aborted!
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: pg_proc (ActiveRecord::StatementInvalid)
/gems/ruby/3.3.0/gems/sqlite3-2.1.1-x86_64-linux-gnu/lib/sqlite3/statement.rb:36:in `prepare'
/gems/ruby/3.3.0/gems/sqlite3-2.1.1-x86_64-linux-gnu/lib/sqlite3/statement.rb:36:in `initialize'
/gems/ruby/3.3.0/gems/sqlite3-2.1.1-x86_64-linux-gnu/lib/sqlite3/database.rb:170:in `new'
/gems/ruby/3.3.0/gems/sqlite3-2.1.1-x86_64-linux-gnu/lib/sqlite3/database.rb:170:in `prepare'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/sqlite3/database_statements.rb:94:in `perform_query'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:556:in `block (2 levels) in raw_execute'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract_adapter.rb:1011:in `block in with_raw_connection'
/gems/ruby/3.3.0/gems/activesupport-8.0.0.rc1/lib/active_support/concurrency/null_lock.rb:9:in `synchronize'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract_adapter.rb:983:in `with_raw_connection'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:555:in `block in raw_execute'
/gems/ruby/3.3.0/gems/activesupport-8.0.0.rc1/lib/active_support/notifications/instrumenter.rb:58:in `instrument'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract_adapter.rb:1129:in `log'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:554:in `raw_execute'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:591:in `internal_execute'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:137:in `execute'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract/query_cache.rb:27:in `execute'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/sqlite3/database_statements.rb:56:in `execute'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/adapters/postgres/functions.rb:50:in `functions_from_postgres'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/adapters/postgres/functions.rb:42:in `all'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/adapters/postgres/functions.rb:31:in `all'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/adapters/postgres.rb:50:in `functions'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/schema_dumper/function.rb:34:in `dumpable_functions_in_database'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/schema_dumper/function.rb:26:in `functions'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/schema_dumper/function.rb:16:in `tables'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/schema_dumper/trigger.rb:8:in `tables'
/gems/ruby/3.3.0/gems/scenic-1.8.0/lib/scenic/schema_dumper.rb:7:in `tables'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/schema_dumper.rb:65:in `dump'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/schema_dumper.rb:46:in `block in dump'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:412:in `with_connection'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/schema_dumper.rb:45:in `dump'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/tasks/database_tasks.rb:423:in `block in dump_schema'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/tasks/database_tasks.rb:422:in `open'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/tasks/database_tasks.rb:422:in `dump_schema'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/railties/databases.rake:468:in `block (4 levels) in <main>'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/tasks/database_tasks.rb:527:in `with_temporary_pool'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/tasks/database_tasks.rb:499:in `block in with_temporary_pool_for_each'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/tasks/database_tasks.rb:498:in `each'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/tasks/database_tasks.rb:498:in `with_temporary_pool_for_each'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/railties/databases.rake:465:in `block (3 levels) in <main>'
/gems/ruby/3.3.0/gems/bugsnag-6.27.1/lib/bugsnag/integrations/rake.rb:23:in `execute'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/railties/databases.rake:112:in `block (2 levels) in <main>'
/gems/ruby/3.3.0/gems/bugsnag-6.27.1/lib/bugsnag/integrations/rake.rb:23:in `execute'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/railties/databases.rake:106:in `block (2 levels) in <main>'
/gems/ruby/3.3.0/gems/bugsnag-6.27.1/lib/bugsnag/integrations/rake.rb:23:in `execute'
/gems/ruby/3.3.0/gems/rake-13.2.1/exe/rake:27:in `<top (required)>'
/usr/local/bundle/gems/bundler-2.5.5/lib/bundler/cli/exec.rb:58:in `load'
/usr/local/bundle/gems/bundler-2.5.5/lib/bundler/cli/exec.rb:58:in `kernel_load'
/usr/local/bundle/gems/bundler-2.5.5/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/bundle/gems/bundler-2.5.5/lib/bundler/cli.rb:451:in `exec'
/usr/local/bundle/gems/bundler-2.5.5/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/bundle/gems/bundler-2.5.5/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/bundle/gems/bundler-2.5.5/lib/bundler/vendor/thor/lib/thor.rb:527:in `dispatch'
/usr/local/bundle/gems/bundler-2.5.5/lib/bundler/cli.rb:34:in `dispatch'
/usr/local/bundle/gems/bundler-2.5.5/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/bundle/gems/bundler-2.5.5/lib/bundler/cli.rb:28:in `start'
/usr/local/bundle/gems/bundler-2.5.5/exe/bundle:28:in `block in <top (required)>'
/usr/local/bundle/gems/bundler-2.5.5/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/bundle/gems/bundler-2.5.5/exe/bundle:20:in `<top (required)>'
/usr/local/bundle/bin/bundle:25:in `load'
/usr/local/bundle/bin/bundle:25:in `<main>'
I also tried shifting the DDL statements all into migration files instead at a result, which did allow the migrations to run successfully, except them fail at the same step when dumping into the schema file by the looks:
-- add_foreign_key("solid_queue_scheduled_executions", "solid_queue_jobs", {:column=>"job_id", :on_delete=>:cascade})
-> 0.0080s
== 202410270907 Initial: migrated (0.1169s) ===================================
** Invoke db:_dump (first_time)
** Execute db:_dump
** Invoke db:schema:dump (first_time)
** Invoke db:load_config
** Execute db:schema:dump
bin/rails aborted!
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: pg_proc (ActiveRecord::StatementInvalid)
/gems/ruby/3.3.0/gems/sqlite3-2.1.1-x86_64-linux-gnu/lib/sqlite3/statement.rb:36:in `prepare'
/gems/ruby/3.3.0/gems/sqlite3-2.1.1-x86_64-linux-gnu/lib/sqlite3/statement.rb:36:in `initialize'
/gems/ruby/3.3.0/gems/sqlite3-2.1.1-x86_64-linux-gnu/lib/sqlite3/database.rb:170:in `new'
/gems/ruby/3.3.0/gems/sqlite3-2.1.1-x86_64-linux-gnu/lib/sqlite3/database.rb:170:in `prepare'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/sqlite3/database_statements.rb:94:in `perform_query'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:556:in `block (2 levels) in raw_execute'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract_adapter.rb:1011:in `block in with_raw_connection'
/gems/ruby/3.3.0/gems/activesupport-8.0.0.rc1/lib/active_support/concurrency/null_lock.rb:9:in `synchronize'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract_adapter.rb:983:in `with_raw_connection'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:555:in `block in raw_execute'
/gems/ruby/3.3.0/gems/activesupport-8.0.0.rc1/lib/active_support/notifications/instrumenter.rb:58:in `instrument'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract_adapter.rb:1129:in `log'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:554:in `raw_execute'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:591:in `internal_execute'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract/database_statements.rb:137:in `execute'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract/query_cache.rb:27:in `execute'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/sqlite3/database_statements.rb:56:in `execute'
/usr/local/lib/ruby/3.3.0/delegate.rb:87:in `method_missing'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/adapters/postgres/functions.rb:50:in `functions_from_postgres'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/adapters/postgres/functions.rb:42:in `all'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/adapters/postgres/functions.rb:31:in `all'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/adapters/postgres.rb:50:in `functions'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/schema_dumper/function.rb:34:in `dumpable_functions_in_database'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/schema_dumper/function.rb:26:in `functions'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/schema_dumper/function.rb:16:in `tables'
/gems/ruby/3.3.0/gems/fx-0.8.0/lib/fx/schema_dumper/trigger.rb:8:in `tables'
/gems/ruby/3.3.0/gems/scenic-1.8.0/lib/scenic/schema_dumper.rb:7:in `tables'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/schema_dumper.rb:65:in `dump'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/schema_dumper.rb:46:in `block in dump'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:412:in `with_connection'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/schema_dumper.rb:45:in `dump'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/tasks/database_tasks.rb:423:in `block in dump_schema'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/tasks/database_tasks.rb:422:in `open'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/tasks/database_tasks.rb:422:in `dump_schema'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/railties/databases.rake:468:in `block (4 levels) in <main>'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/tasks/database_tasks.rb:527:in `with_temporary_pool'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/tasks/database_tasks.rb:499:in `block in with_temporary_pool_for_each'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/tasks/database_tasks.rb:498:in `each'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/tasks/database_tasks.rb:498:in `with_temporary_pool_for_each'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/railties/databases.rake:465:in `block (3 levels) in <main>'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `block in execute'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `each'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `execute'
/gems/ruby/3.3.0/gems/bugsnag-6.27.1/lib/bugsnag/integrations/rake.rb:23:in `execute'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:188:in `invoke'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/railties/databases.rake:112:in `block (2 levels) in <main>'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `block in execute'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `each'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `execute'
/gems/ruby/3.3.0/gems/bugsnag-6.27.1/lib/bugsnag/integrations/rake.rb:23:in `execute'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:188:in `invoke'
/gems/ruby/3.3.0/gems/activerecord-8.0.0.rc1/lib/active_record/railties/databases.rake:106:in `block (2 levels) in <main>'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `block in execute'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `each'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `execute'
/gems/ruby/3.3.0/gems/bugsnag-6.27.1/lib/bugsnag/integrations/rake.rb:23:in `execute'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:188:in `invoke'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:188:in `invoke_task'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block (2 levels) in top_level'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `each'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block in top_level'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:147:in `run_with_threads'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:132:in `top_level'
/gems/ruby/3.3.0/gems/railties-8.0.0.rc1/lib/rails/commands/rake/rake_command.rb:27:in `block (2 levels) in perform'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:214:in `standard_exception_handling'
/gems/ruby/3.3.0/gems/railties-8.0.0.rc1/lib/rails/commands/rake/rake_command.rb:27:in `block in perform'
/gems/ruby/3.3.0/gems/railties-8.0.0.rc1/lib/rails/commands/rake/rake_command.rb:44:in `block in with_rake'
/gems/ruby/3.3.0/gems/rake-13.2.1/lib/rake/rake_module.rb:59:in `with_application'
/gems/ruby/3.3.0/gems/railties-8.0.0.rc1/lib/rails/commands/rake/rake_command.rb:41:in `with_rake'
/gems/ruby/3.3.0/gems/railties-8.0.0.rc1/lib/rails/commands/rake/rake_command.rb:20:in `perform'
/gems/ruby/3.3.0/gems/railties-8.0.0.rc1/lib/rails/command.rb:150:in `invoke_rake'
/gems/ruby/3.3.0/gems/railties-8.0.0.rc1/lib/rails/command.rb:67:in `block in invoke'
I’m not sure what I’m missing or need to change.
My database.yml
is:
default: &default
adapter: <%= ENV["DB_ADAPTER"] || 'postgresql' %>
encoding: unicode
host: <%= ENV["DATABASE_HOST"] %>
port: <%= ENV["DATABASE_PORT"] %>
username: <%= ENV['POSTGRES_USER'] %>
password: <%= ENV['POSTGRES_PASSWORD'] %>
database: <%= ENV['POSTGRES_DB'] %>
pool: <%= ENV["DATABASE_POOL"] %>
reconnect: true
timeout: 10000
development:
primary:
<<: *default
cable:
adapter: sqlite3
database: storage/development_cable.sqlite3
migrations_paths: db/migrate_cable
cache:
adapter: sqlite3
database: storage/development_cache.sqlite3
migrations_paths: db/migrate_cache
errors:
adapter: sqlite3
database: storage/development_errors.sqlite3
migrations_paths: db/migrate_errors
queue:
adapter: sqlite3
database: storage/development_queue.sqlite3
migrations_paths: db/migrate_queue
test:
primary:
<<: *default
errors:
adapter: sqlite3
database: storage/test_errors.sqlite3
migrations_paths: db/migrate_errors
queue:
adapter: sqlite3
database: storage/test_queue.sqlite3
migrations_paths: db/migrate_queue
production:
primary:
<<: *default
cable:
adapter: sqlite3
database: storage/production_cable.sqlite3
migrations_paths: db/migrate_cable
cache:
adapter: sqlite3
database: storage/production_cache.sqlite3
migrations_paths: db/migrate_cache
errors:
adapter: sqlite3
database: storage/production_errors.sqlite3
migrations_paths: db/migrate_errors
queue:
adapter: sqlite3
database: storage/production_queue.sqlite3
migrations_paths: db/migrate_queue