2014-01-22 2 views
2

Я пытаюсь выполнить запрос к моей базе данных mysql. Я использую поваренную книгу database и могу установить соединение с моей базой данных. Я пытаюсь запросить мою базу данных для информации, поэтому теперь вопрос заключается в том, как хранить информацию, чтобы я мог получить доступ к ней на другом ресурсе. Где хранятся результаты запроса? Это мой рецепт:store mysql query information chef

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

Заранее спасибо

+0

Какой ресурс вы хотите использовать с вашими запрошенными данными? – datelligence

+0

@datelligent Я хотел обновить файл 'etc/group' с информацией, возвращенной из запроса, поэтому он будет использоваться в ресурсе' file' –

+0

. Затем вы должны использовать [PHP file_put_contents] (http://php.net/ file_put_contents), чтобы добавить данные в ваш файл. Также можно использовать ** fwrite **. В общем, есть инструменты для создания и записи файлов или для открытия и обновления, а затем для хранения ваших данных. – datelligence

ответ

5

Если у вас нет опыта работы с Ruby, это может быть очень запутанной. Невозможно «вернуть» результат провайдера из ресурса шеф-повара. mysql_database - это DSL-метод Chef::Recipe, который переводится в 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 
+0

спасибо, что Ruby помог мне справиться с ним красиво –

0

Я считаю, используя старый добрый повар :: подмешать: 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