ruby 花波2.0及续集

ax6ht2ek  于 2023-03-08  发布在  Ruby
关注(0)|答案(1)|浏览(112)

我将按照以下指南开始使用hanami
https://guides.hanamirb.org/v2.0/introduction/getting-started/
我更喜欢Sequel,而不是ROM,但我偶然发现了它的持久性:
https://guides.hanamirb.org/v2.0/introduction/getting-started/#persisting-books
在我的gemfile中,我使用了sequelpg,而不是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。同样的错误...)

ycggw6v2

ycggw6v21#

Hanami默认通过Dotenv加载环境变量,你可以像评论中提到的@engineersmnky一样手动加载,引用他的回应以供参考:
看起来你正在使用Dotenv,如果是这样的话,你应该只能够添加require 'dotenv/tasks',然后在:dotenv键下命名你的rake任务,或者添加require 'dotenv/load',这将加载.env文件。- @engineersmnky
然而,我更喜欢在我的rake任务中加载hanami/prepare,它加载的配置与控制台相同,使我们的任务快速干净,但会自动为您解析所有配置。
我在configuring ROM from scratch tutorial中有一个这样的示例
长话短说,通过调用:

# rakefile
require "hanami/prepare"

* ....

在rakefile中,您将加载所有设置,这些设置由预配置的引擎解析,在本例中为dotenv
例如,当您希望通过不同的引擎(例如从YAML?)加载环境/设置时,这很有用,在这种情况下,不需要在rakefile中进行任何更改。

相关问题