Ich habe ein Skript, das einige Daten aus einer sqlite3-Datenbank laden und dann in Discourse importieren muss.
rails runner
Ich ging davon aus, dass ich etwas wie das Folgende in /shared/add_in_reverse.rb verwenden könnte:
require "sqlite3"
# Eine Datenbank öffnen
db = SQLite3::Database.new "sqlite3.db"
k = 1234
db.execute( "SELECT * from foo where id = ?'", [ k ] ) do |row|
puts row
end
title = "hallo da"
u = User.find_or_create_by(username: "mexample") do |user|
user.email = "me@example.com"
end
c = Category.find_or_create_by(name: "Etwas von mexample") do |category|
category.user = u
end
Topic.create!( title: title, category: c, user: u )
Und dann ausführen mit:
rails r /shared/my_custom_script.rb
Aber das schlägt mit cannot load such file -- sqlite3 (LoadError) fehl.
bundler: failed to load command: script/rails (script/rails)
/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 /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 und bundle exec?
Ich erinnerte mich, dass Ruby manchmal Gemfiles verwenden muss? Also dachte ich, wenn ich mich im Verzeichnis /var/www/discourse befinde, könnte ich bundle exec voranstellen. Aber das schlägt fehl:
# 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
Ok. Ich habe einige Beispiele mit IMPORT=1 gesehen. Brauche ich das?
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
Ich habe die Gemfile überhaupt nicht geändert; ich möchte nur die in dieser Gemfile angegebene SQLite verwenden.
Warum zwei Rails/Ruby?
Ist das Problem, dass dasjenige im Pfad falsch ist und ich das mitgelieferte Ruby verwenden sollte? Ich sehe eine Menge Rubys und Rails. Aber die Verwendung des mitgelieferten funktioniert nicht (oder ich weiß nicht, wie ich es richtig benutze).
# 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>'