我将按照以下指南开始使用hanami
:
https://guides.hanamirb.org/v2.0/introduction/getting-started/
我更喜欢Sequel,而不是ROM,但我偶然发现了它的持久性:
https://guides.hanamirb.org/v2.0/introduction/getting-started/#persisting-books
在我的gemfile
中,我使用了sequel
和pg
,而不是rom
。
我将以下内容添加到config/app.rb
:
require "sequel"
config/providers/persistence.rb
包含以下内容:
Hanami.app.register_provider :persistence, namespace: true do
prepare do
#config = ROM::Configuration.new(:sql, target["settings"].database_url)
config = DB = Sequel.connect(database_url)
register "config", config
register "db", config.gateways[:default].connection
end
start do
config = target["persistence.config"]
# config.auto_registration(
# target.root.join("lib/bookshelf/persistence"),
# namespace: "Bookshelf::Persistence"
# )
register "sequel", DB
end
end
config/settings.rb
:
module Bookshelf
class Settings < Hanami::Settings
# Define your app settings here, for example:
#
# setting :my_flag, default: false, constructor: Types::Params::Bool
setting :database_url, constructor: Types::String
end
end
最后在.env
和.env.test
文件中定义database_url。
# .env
DATABASE_URL=postgres://thiebo@localhost:5432/bookshelf_development
从hanami控制台运行此命令可以正常工作:
moi@Hugo bookshelf % bundle exec hanami console
bookshelf[development]> Hanami.app["settings"].database_url
=> "postgres://moi@localhost:5432/bookshelf_development"
bookshelf[development]>
Sequel允许将迁移作为rake任务运行:www.example.comhttp://sequel.jeremyevans.net/rdoc/files/doc/migration_rdoc.html#label-Running+migrations+from+a+Rake+task
我的Rakefile:
require "sequel"
namespace :db do
desc "Run migrations"
task :migrate, [:version] do |t, args|
require "sequel/core"
Sequel.extension :migration
version = args[:version].to_i if args[:version]
Sequel.connect(ENV.fetch("DATABASE_URL")) do |db|
Sequel::Migrator.run(db, "db/migrations", target: version)
end
end
end
但是......当我运行时,尝试从控制台运行迁移,如Sequel文档所示:
thiebo@Hugo bookshelf % rake db:migrate
rake aborted!
KeyError: key not found: "DATABASE_URL"
/Users/thiebo/bookshelf/Rakefile:12:in `fetch'
/Users/thiebo/bookshelf/Rakefile:12:in `block (2 levels) in <top (required)>'
/Users/thiebo/.rvm/gems/ruby-3.0.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'
/Users/thiebo/.rvm/gems/ruby-3.0.0/bin/ruby_executable_hooks:22:in `eval'
/Users/thiebo/.rvm/gems/ruby-3.0.0/bin/ruby_executable_hooks:22:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
(it也不适用于database_url
而不是DATABASE_URL
。同样的错误...)
1条答案
按热度按时间ycggw6v21#
Hanami默认通过Dotenv加载环境变量,你可以像评论中提到的@engineersmnky一样手动加载,引用他的回应以供参考:
看起来你正在使用Dotenv,如果是这样的话,你应该只能够添加require 'dotenv/tasks',然后在:dotenv键下命名你的rake任务,或者添加require 'dotenv/load',这将加载.env文件。- @engineersmnky
然而,我更喜欢在我的rake任务中加载
hanami/prepare
,它加载的配置与控制台相同,使我们的任务快速干净,但会自动为您解析所有配置。我在configuring ROM from scratch tutorial中有一个这样的示例
长话短说,通过调用:
在rakefile中,您将加载所有设置,这些设置由预配置的引擎解析,在本例中为
dotenv
。例如,当您希望通过不同的引擎(例如从YAML?)加载环境/设置时,这很有用,在这种情况下,不需要在rakefile中进行任何更改。