#ruby #oracle #tsql #activerecord #oci8
#ruby #Oracle #tsql #activerecord #oci8
Вопрос:
Я пытаюсь получить значение из таблицы (employee), подключающейся через базу данных oracle. Поскольку в одном столбце содержится 100 значений, мне нужно было бы выполнить итерацию таблицы и получить точное значение.
У меня есть код, который работает, если я использую индекс no. например, строка [1], но я хотел использовать имя столбца «first name» вместо строки[1]. Ниже приведен имеющийся у меня код, который работает. Код:
def load_borrower
connection = OCI8.new('usrname', 'pwd', //host:portno/sid')
connection.exec(("SELECT BI_PREFIX, BI_FNAME, BI_MNAME, BI_LNAME, B.BI_SUFFIX, BI_ID_TYPE, BI_ID_NUMBER, BI_DOB, B1.*, R.*, M.*, C.*, L.* FROM EMPLOYEE, SC_BORROWERPREF_NEW S1, BORROWER_NEW B, BORROWERPREF_NEW B1, RES_ADD R, MAIL_ADD M, CLOS_ADD C, LLORD_ADD L WHERE S2=SCENARIO_ID = S1.SCENARIO_ID AND S1.PREF_ID = B1.PREF_ID AND B1.BORROWER_ID = B.BORROWER_ID AND B1.PREF_ID = R.RES_PREF_ID AND B1.PREF_ID = M.MAIL_PREF_ID AND B1.PREF_ID = C.CLOS_PREF_ID AND B1.PREF_ID = L.LLORD_PREF_ID AND S.RELEASE_ID= "1" AND S.SCENARIO_NO = '2' ORDER BY S1.SC_BORROWERPREF_ID") do |row|
$BI_PREFIX=row[0].to_s
$BI_FNAME=row[1].to_s
$BI_MNAME=row[2].to_s
$BI_LNAME=row[3].to_s
$BI_SUFFIX=row[4].to_s
$BI_BI_ID_TYPE=row[5].to_s
$BI_BI_ID_NUMBER=row[6].to_s
$BI_DOB=row[7].to_s
$BI_EMAIL=row[9].to_s
$BI_CELL_PH=row[11].to_s
$BI_WORK_PH=row[12].to_s
$BI_PREF_CONT=row[13].to_s
$BI_MAR_STATUS=row[16].to_s
$BI_EMP_STATUS=row[23].to_s
$BI_EDUC_YEARS=row[17].to_s
$BI_NUM_DEPEND=row[21].to_s
end
end
Теперь я запускаю перечисленные ниже функции
load_borrower
Итак, приведенный выше код прямо сейчас работает нормально. Но, как вы можете видеть выше, я определяю переменные из таблицы db как row[5], row[24], подобные этим, что является очень беспокойным и отнимает много времени, хотя это работает. Итак, мне просто интересно, есть ли у нас какой-либо метод или команда для использования column_name таким образом, чтобы он получал значение из строки и столбца, например row[‘Emp_id’], вместо того, чтобы находить индекс каждого column_name.
Я не уверен, является ли это недостатком Ruby, поскольку он обрабатывает таблицу из базы данных в виде массива, и, возможно, именно поэтому мы не можем указать с помощью column_name.
Комментарии:
1. Попробовать
row.EMP_ID
илиrow.emp_id
?2. Я не вижу, чтобы в вашем коде вызывались какие-либо методы Watir, поэтому я не понимаю, почему в вопросе есть тег watir.
3. @zabba: строка. EMP_ID не работает, поскольку выдает ошибку метода.
4. По сути, эта проблема не имеет ничего общего с Watir, она связана с доступом к Oracle DB с помощью RUBY.. Включение другого кода просто затрудняет чтение и запутывает проблему. (честно говоря, я думаю, что нам было бы лучше, если бы кто-нибудь мог вернуть вопрос обратно несколькими правками к тому месту, где у нас только что был код, который пытался получить доступ к БД)
5. Хорошо, Чак, я удалил другой код, отличный от того, который обращается к oracle db. Спасибо.
Ответ №1:
Во-первых, кажется, что вы немного сбиты с толку границами и разделениями между различными используемыми вами битами технологии. В предоставленном вами коде нет Watir, НИ ОДНОГО. это все чистый Ruby и небольшая часть материала из OCI8 Gem. GEM — это стандартный способ, который разработчики Ruby используют для распространения библиотек кода и программ, написанных на языке Ruby. Смотрите ЗДЕСЬ для получения дополнительной информации, чтобы лучше понять, что такое Gem и как они используются.
Watir — это еще один драгоценный камень Ruby, предназначенный для управления веб-браузерами, и вы могли бы использовать его в другом месте вашего кода, но это не относится к этому вопросу или OCI8, за исключением того, что оба они являются библиотеками кода Ruby, распространяемыми как драгоценные камни. Итак, давайте оставим это в стороне, чтобы не путать вещи.
Поведение, которое вы видите, — это то, как работает OCI8 gem, не имеющее ничего общего конкретно с Ruby. Если вы хотите что-то более элегантное, тогда посмотрите на различные драгоценные камни, которые были созданы для доступа к БД с помощью Ruby, например ActiveRecord, который уже был предложен в другом ответе. OCI8 Gem возвращает массив только в том случае, если у вас есть результаты, загружаемые в блок, как вы делаете в своем текущем коде. В противном случае результаты будут в объекте, называемом Cursor, и вы можете использовать метод fetch_hash курсора для получения выбранных данных в виде хэша. Хэш-ключи — это имена столбцов. (см http://ruby-oci8.rubyforge.org/en/api_OCI8Cursor.html )
Позвольте мне настоятельно рекомендовать вам потратить немного времени на изучение языка Ruby, прежде чем углубляться в свой текущий проект. Учитывая характер кодирования, которым вы, похоже, занимаетесь, я бы посоветовал вам прочитать книгу Брайана Марика «Everyday Scripting with Ruby», это даст вам гораздо лучшее представление об используемой вами технологии, и вы поймете лучше, когда мы будем использовать такие термины, как «хэш», как я только что сделал.
Если вы позволите, немного общих советов относительно того, как вы собираетесь взаимодействовать с вашей базой данных. ИМХО, вам следует воспользоваться преимуществами базы данных, создав запрос, который возвращает ТОЛЬКО те данные, которые вы хотите, вместо того, чтобы собирать огромные объемы данных и пытаться проанализировать их вручную. Это более эффективное использование ресурса, использует меньше памяти, требует меньше времени для передачи информации из базы данных, и независимо от того, насколько хорошим может быть ваш код синтаксического анализа, он не будет так хорош, как то, что написали люди Oracle. Позвольте базе данных выполнить тяжелую работу, для этого она и существует.
Если здесь вы имеете дело с данными для проведения тестирования или проверки результатов, а не с созданием одного огромного монолитного массива, я бы рекомендовал вам использовать гораздо более модульный подход. Используйте одну глобальную переменную, такую как EMP_ID текущего пользователя, с которым вы тестируете, и пусть тестовый код получает результаты запроса только для значений, необходимых для каждой проверки, или небольшую логическую группу проверок, таких как части адреса. Намного проще создавать материал таким образом в каждом конкретном случае, работая по ходу дела, вместо того чтобы пытаться записать весь бит поиска данных в одном гигантском фрагменте, обслуживание которого будет сущим кошмаром.
В нынешнем виде весь ваш тестовый код, который проверяет функцию или проверяет, как работает сайт, будет тесно связан с большой монолитной частью, которая извлекает данные из базы данных. это создает множество зависимостей и затрудняет поддержку вашего тестового кода. Если вы работаете с вещами более модульным способом, когда на каждом этапе проверки извлекаются только те данные, которые ему необходимы, то намного проще расширять или модифицировать ваш тестовый код по мере изменения сайта или базы данных.
Комментарии:
1. вздох , сделав это, вы только еще больше все запутали. Watir на самом деле не имеет никакого отношения к вашему вопросу.
2. Верно, Чак, но я использую ruby для Watir, так что это вроде как связано. Поскольку вам нужен был код watir, я поместил его туда. Люди, которые читают проблему, вероятно, поймут, что я действительно хочу сказать.
3. Поскольку я использую oci8 gem, который является одним из gem watir, я подумал, что получу помощь от людей, которые использовали oci8 gem в watir и обращались к БД по column_names. Кстати, я еще не начал использовать Ruby или Watir в своем проекте. В настоящее время мы используем SAHI, который работает нормально. Я просто пытался увидеть, насколько watir эффективен в моем текущем проекте. Спасибо
4. Я никогда не просил вас публиковать код Watir, я просто указал, что в вашем вопросе не было кода watir, и на самом деле вопрос не имел ничего общего с watir. Вы спрашиваете о том, как получить данные из oracle и иметь возможность обращаться к вещам по имени столбца. то, что вы хотите с этим сделать после этого, на самом деле не имеет значения
Ответ №2:
Если бы у вас был массив, содержащий имена столбцов, вы могли бы объединить его с массивом строк и создать хэш:
Hash[column_names.zip( row )]
Однако я бы рекомендовал использовать activerecord для этого.
Ответ №3:
Это должно сработать
connection = OCI8.new('usrname', 'pwd', //host:portno/sid')
cursor = connection.exec(("SELECT BI_PREFIX ...")
cols = cursor.get_col_names
while r = cursor.fetch
$BI_PREFIX=r[cols.index('BI_PREFIX')].to_s
...
end