存储mysql查询信息主厨

时间:2014-01-22 21:56:47

标签: mysql database chef chef-recipe

我正在尝试查询我的mysql数据库。我正在使用database食谱,可以与我的数据库建立连接。我试图查询我的数据库以获取信息,所以现在问题是如何存储而不是信息,以便我可以在另一个资源中访问它。查询结果存储在哪里?这是我的食谱:

mysql_database "Get admin users" do
    connection mysql_connection_info
    sql "Select * from #{table_name}"
    action :query
end

提前致谢

2 个答案:

答案 0 :(得分:5)

如果您没有使用Ruby的经验,这可能会让您感到困惑。没有办法从Chef资源“返回”提供者的结果。 mysql_databaseChef::Recipe DSL方法,在运行时转换为Chef::Provider::Database::Mysql。此提供商为defined in the cookbook

如果您花些时间深入了解该提供商,您可以使用db object查看其执行查询的方式。为了获得查询的结果,您需要在配方中创建自己的连接对象并对其执行命令。例如

require 'mysql'
db = ::Mysql.new('host', 'username', 'password', nil, 'port', 'socket') # varies with setup

users = db.query('SELECT * FROM users')

#
# You might need to manipulate the result into a more manageable data 
# structure by splitting on a carriage return, etc...
#
# Assume the new object is an Array where each entry is a username.
#

file '/etc/group' do
  contents users.join("\n")
end

答案 1 :(得分:0)

我发现使用好的老Chef :: Mixin:ShellOut / shell_out()对于这个工作已经足够了,并且它与DB无关(假设你知道你的SQL :))。如果您查询的只是一个值,那么它的效果特别好;对于多行/列,您需要解析SQL查询结果。您需要从结果集中隐藏行计数,列标题,吃掉前面的空格等,以获得所需的查询结果。例如,下面适用于SQL Server:

单项

so = shell_out!("sqlcmd ... -Q \"set nocount on; select file_name(1)\" -h-1 -W")
db_logical_name = so.stdout.chop

多行/列(行内值的从0开始的位置告诉您该列是什么)

so = shell_out!("sqlcmd ... -Q \"set nocount on; select * from my_table\" -h-1 -W")
rows_column_data = so.stdout.chop
# columns within rows are space separated, so can be easily parsed