4

我试图弄清楚如何从数据库中提取数据,而无需在每个 ruby​​ 文件的顶部放置连接字符串。

我正在通过一个小 Sinatra 应用程序学习 ruby​​ 的基础知识,该应用程序从 MSSQL 数据库中提取数据。

到目前为止,我已经成功地创建了各种简单的 erb 页面,通过在每个文件顶部使用以下代码结构来显示来自 MSSQL 数据库的数据:-

<% client = TinyTds::Client.new(:username => 'name', :password => 'password', :dataserver => 'hostname', :database => 'database') %>

<% data = client.execute("SELECT * from tablename") %>

从我发现的书籍、指南和在线教程中,我发现了很多与 PostgreSQL 或 MySQL 数据库有关的配置,在我看来,我需要创建一个中央文件来存储我的连接数据(例如 database.yml 文件)然后在我的应用程序中的某个地方/以某种方式引用它。

这是正确的,我应该在我的 main.rb 文件中这样做,以便我的每个 .erb 文件都不需要连接字符串,还是我还必须在每个 .erb 文件中引用数据库?

我注意到对创建数据库配置变量的引用,例如:-

db_config = YAML.load(File.Open("/path_to_file/database.yml")) [ENV['RAILS_ENV']]

但这显然适合 Rails 应用程序。

我可以为我的 sinatra 驱动的“应用程序”做类似的事情吗?

谢谢。

4

1 回答 1

1

这应该有效:

require "sinatra"
require "sinatra/config_file"

config_file 'path/to/config.yml'

DB = TinyTds::Client.new(
  :username => settings.name, 
  :password => settings.password, 
  :dataserver => settings.hostname, 
  :database => settings.database
) 

get '/' do
  @result = DB.do_stuff
  haml :index
end

不过,我建议您寻找支持 TinyTDS 的 ORM,并使用它来设置数据库连接和运行查询。我经常使用Sequel并且我知道它支持 TinyTDS,但我相信其他人也会这样做。

我还建议不要将诸如数据库设置之类的内容放在签入源代码控制的文件中,因为它是敏感信息。我更喜欢把这种东西放到生产环境变量中,在开发中使用配置文件加载环境变量(为了方便)。使用上面的例子:

DB = TinyTds::Client.new(
  :username => ENV["name"],
  :password => ENV["password"],
  :dataserver => ENV["hostname"],
  :database => ENV["database"]
)

这些环境变量被加载到生产服务器的内存中,这使它们更加安全。对于开发,我在启动 Sinatra 之前加载 YAML 文件,将每个值添加到 ENV var。我并不是说这是一种标准方式,但我就是这样做的。

于 2013-05-21T20:30:07.450 回答