Как получить Ruby MySQL, возвращающий PHP как результат DB SELECT - PullRequest
0 голосов
/ 26 октября 2011

Поэтому я использую PDO для подключения к БД, например:

$this->dsn[$key] = array('mysql:host=' . $creds['SRVR'] . ';dbname=' . $db, $creds['USER'], $creds['PWD']);
$this->db[$key] = new PDO($this->dsn[$key]);

Используя PDO, я могу выполнить MySQL SELECT, используя что-то вроде этого:

$sql = "SELECT * FROM table WHERE id = ?";
$st = $db->prepare($sql);
$st->execute($id);
$result = $st->fetchAll();

Переменная $ result затем вернет массив массивов, где каждой строке присваивается инкрементный ключ - первая строка имеет ключ массива 0. И затем эти данные будут иметь массив данных БД, подобный этому:

$result (array(2)
  [0]=>[0=>1, "id"=>1, 1=>"stuff", "field1"=>"stuff", 2=>"more stuff", "field2"=>"more stuff" ...],
  [1]=>[0=>2, "id"=>2, 1=>"yet more stuff", "field1"=>"yet more stuff", 2=>"even more stuff", "field2"=>"even more stuff"]);

В этом примере имена полей таблицы БД будут id, field1 и field2. И результат позволяет вам прокручивать массив строк данных и затем обращаться к данным, используя либо индекс (0, 1, 2), либо имя поля («id», «field1», «field2»). Большую часть времени я предпочитаю получать доступ к данным через имена полей, но доступ через оба средства полезен.

Итак, я сейчас изучаю гем ruby-mysql и могу получить данные из БД. Однако я не могу получить имена полей. Я мог бы, вероятно, извлечь его из приведенного оператора SQL, но это требует значительного количества кода для перехвата ошибок и работает только до тех пор, пока я не использую SELECT * FROM ... в качестве своего оператора SELECT.

Так что я использую таблицу, полную имен государств и их сокращений, для моего тестирования. Когда я использую «SELECT State, Abbr FROM states» со следующим кодом

st = @db.prepare(sql)
if empty(where)
  st.execute()
else
  st.execute(where)
end

rows = []
while row = st.fetch do
  rows << row
end
st.close

return rows

Я получаю такой результат:

[["Alabama", "AL"], ["Alaska", "AK"], ...]

И я хочу получить такой результат:

[[0=>"Alabama", "State"=>"Alabama", 1=>"AL", "Abbr"=>"AL"], ...]

Полагаю, у меня нет способа, которым инспекция показала бы это правильно, но я надеюсь, что вы уже поняли идею.

В любом случае, чтобы сделать это? Я видел некоторые ссылки на подобные вещи, но для этого требуется модуль DBI. Я думаю, что это не конец света, но это единственный путь? Или я могу сделать это только с помощью ruby-mysql?

Я копался во всех методах, которые могу найти, но безуспешно. Надеюсь, вы, ребята, можете помочь.

Спасибо Гейб

Ответы [ 2 ]

1 голос
/ 26 октября 2011

Вы можете сделать это самостоятельно без особых усилий:

expanded_rows = rows.map do |r|
    { 0 => r[0], 'State' => r[0], 1 => r[1], 'Abbr' => r[1] }
end

Или более общий подход, который вы могли бы заключить в методе:

columns = ['State', 'Abbr']
expanded_rows = rows.map do |r|
    0.upto(names.length - 1).each_with_object({}) do |i, h|
        h[names[i]] = h[i] = r[i]
    end
end

Таким образом, вы можете собратьrows как вы сейчас, а затем прокачивайте этот массив массивов через что-то вроде того, что выше, и вы должны получить такую ​​структуру данных, которую вы ищете с другой стороны.

Существуют и другие методыrow вы также получаете от st.fetch:

http://rubydoc.info/gems/mysql/2.8.1/Mysql/Result

Но вам придется немного поэкспериментировать, чтобы увидеть, что именно они возвращают какдокументация немного тонкая.

Вы должны быть в состоянии получить имена столбцов из row или st:

http://rubydoc.info/gems/mysql/2.8.1/Mysql/Stmt

но опять же, вам придется экспериментировать, чтобы выяснить API.Извините, у меня нет ничего настроенного для работы с MySQL API, который вы используете, поэтому я не могу быть более конкретным.

0 голосов
/ 26 октября 2011

Я понимаю, что все программисты php - ковбои, которые думают, что использование слоя db - это мошенничество, но вы действительно должны рассмотреть activerecord.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...