我正在尝试查询我的mysql数据库。我正在使用database
食谱,可以与我的数据库建立连接。我试图查询我的数据库以获取信息,所以现在问题是如何存储而不是信息,以便我可以在另一个资源中访问它。查询结果存储在哪里?这是我的食谱:
mysql_database "Get admin users" do
connection mysql_connection_info
sql "Select * from #{table_name}"
action :query
end
提前致谢
答案 0 :(得分:5)
如果您没有使用Ruby的经验,这可能会让您感到困惑。没有办法从Chef资源“返回”提供者的结果。 mysql_database
是Chef::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