У меня есть скрипт, который должен загрузить данные из sqlite3, а затем импортировать их в Discourse.
rails runner
Я предположил, что могу использовать что-то вроде этого в /shared/add_in_reverse.rb:
require "sqlite3"
# Открыть базу данных
db = SQLite3::Database.new "sqlite3.db"
k = 1234
db.execute( "SELECT * from foo where id = ?'", [ k ] ) do |row|
puts row
end
title = "hello there"
u = User.find_or_create_by(username: "mexample") do |user|
user.email = "me@example.com"
end
c = Category.find_or_create_by(name: "Something by mexample") do |category|
category.user = u
end
Topic.create!( title: title, category: c, user: u )
А затем запустить его командой:
rails r /shared/my_custom_script.rb
Однако это завершается ошибкой cannot load such file -- sqlite3 (LoadError):
bundler: failed to load command: script/rails (script/rails)
<internal:/usr/local/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:38:in `require': cannot load such file -- sqlite3 (LoadError)
from <internal:/usr/local/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:38:in `require'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bootsnap-1.17.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:17:in `require'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/zeitwerk-2.6.12/lib/zeitwerk/kernel.rb:38:in `require'
Gemfile и bundle exec?
Я вспомнил, что Ruby иногда требует использования Gemfile. Поэтому я подумал, что если я нахожусь в директории /var/www/discourse, то могу добавить bundle exec перед командой. Но это тоже не сработало:
# bundle exec rails r /shared/add_in_reverse.rb
fatal: detected dubious ownership in repository at '/var/www/discourse'
To add an exception for this directory, call:
git config --global --add safe.directory /var/www/discourse
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/postgresql_adapter.rb:81:in `rescue in new_client': We could not find your database: discourse. Which can be found in the database configuration file located at config/database.yml. (ActiveRecord::NoDatabaseError)
To resolve this issue:
- Did you create the database for this app, or delete it? You may need to create your database.
- Has the database name changed? Check your database.yml config has the correct database name.
...
IMPORT=1
Хорошо. Я видел примеры с использованием IMPORT=1. Нужно ли мне это?
IMPORT=1 rails r /shared/add_in_reverse.rb
You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
updated Gemfile.lock to version control.
If this is a development machine, remove the /var/www/discourse/Gemfile freeze
by running `bundle config unset deployment`.
The list of sources changed
The dependencies in your gemfile changed
You have added to the Gemfile:
* mysql2
* redcarpet
* sqlite3 (~> 1.3, >= 1.3.13)
* ruby-bbcode-to-md
* reverse_markdown
* tiny_tds
* csv
* parallel
# IMPORT=1 bundle exec rails r /shared/add_in_reverse.rb
You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
updated Gemfile.lock to version control.
If this is a development machine, remove the /var/www/discourse/Gemfile freeze
by running `bundle config unset deployment`.
The list of sources changed
The dependencies in your gemfile changed
You have added to the Gemfile:
* mysql2
* redcarpet
* sqlite3 (~> 1.3, >= 1.3.13)
* ruby-bbcode-to-md
* reverse_markdown
* tiny_tds
* csv
* parallel
Я вообще не изменял Gemfile; я просто хочу использовать sqlite, указанный в этом файле.
Почему два rails/ruby?
Проблема в том, что версия в PATH неверная, и мне следует использовать ту, что vendored (встроенная в проект)? Я вижу множество версий Ruby и Rails. Но использование встроенной версии тоже не работает (или я не знаю, как правильно её использовать).
# which ruby
/usr/local/bin/ruby
# which rails
/usr/local/bin/rails
# find /var/www/discourse/ | grep ruby | grep vendor | grep bin | grep rails
/var/www/discourse/vendor/bundle/ruby/3.2.0/bin/rails
# /var/www/discourse/vendor/bundle/ruby/3.2.0/bin/rails runner /shared/add_in_reverse.rb
/usr/local/lib/ruby/site_ruby/3.2.0/rubygems.rb:264:in `find_spec_for_exe': can't find gem railties (>= 0.a) with executable rails (Gem::GemNotFoundException)
from /usr/local/lib/ruby/site_ruby/3.2.0/rubygems.rb:283:in `activate_bin_path'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/bin/rails:25:in `<main>'