Как примерно и автоматически перевести содержимое базы данных один раз? - PullRequest
3 голосов
/ 27 декабря 2010

Допустим, существует очень большая база данных SQL - сотни таблиц, тысячи полей, миллионы записей.Эта база данных на голландском языке.Я хотел бы перевести все значения определенных полей для целей тестирования на английский язык.Оно не должно быть полностью правильным, оно должно быть читаемым для тестировщиков.

Я знаю, что большинство текстов хранятся в полях, называемых «имя» и «описание» во всей базе данных.Или в основном все поля с типом NVARCHAR (любой длины) во всех таблицах будут кандидатами на перевод.Перечисление всех таблиц и полей - это действительно слишком много работы, и я бы хотел этого избежать, поэтому достаточно будет перевести только эти поля.

Есть ли способ пройтись по всем таблицам и по всем записямизвлечь значения из определенных полей и заменить их их английскими переводами?Можно ли это сделать только с помощью SQL?

Сервер БД не имеет значения - я могу смонтировать базу данных на MSSQL, Oracle или любом другом сервере по своему выбору.Перевод текста с помощью Google или другого автоматического инструмента достаточно хорош для этой цели.Конечно, этот инструмент должен иметь API для автоматического использования.

Кто-нибудь имеет опыт подобных операций?

1 Ответ

3 голосов
/ 27 декабря 2010

В псевдокоде, вот что я бы сделал, используя Oracle:

Query AllFieldsQuery = new Query(connection,"Select table_name, column_name 
from user_tab_columns where column_name='name' OR column_name='description'");

AllFieldsQuery.ExecuteReader();

Это дает вам что-то вроде этого:

TABLE_NAME | COLUMN_NAME

Таблица1 | Имя

Таблица2 | Имя

Таблица2 | Описание

........... | ...........

Foreach TableColumnLine

Query FieldQuery = new Query("Select DISTINCT "+COLUMN_NAME+" AS ToTranslate 
from +"TABLE_NAME);

Create a new parametrized query :
MyParamQuery = new ParamQuery(connection, UPDATE TABLE_NAME SET COLUMN_NAME =
@Translated WHERE COLUMN_NAME = @ToTranslate);

Foreach ToTranslateLine

@Translated = GetTranslationFromGoogle(@ToTranslate);

MyParamQuery.Execute(ToTranslate = @ToTranslate, Translated = @Translated);

End Foreach ToTranslateLine

End Foreach TableColumnLine

AllFieldsQuery предоставляет вам все поля во всех таблицах, которые необходимо обновить.

FieldQuery дает вам все тексты, которые вам нужно перевести.

MyParamQuery обновляет каждый из этих текстов.

Это может быть очень длительный процесс, это зависит также от времени, которое вы тратите на перевод. Я бы порекомендовал сделать хотя бы коммит по таблице и напечатать отчет, который сообщит вам по каждой таблице, если все прошло нормально, потому что вы могли бы в своем API иметь функцию exclude, которая исключает поля и / или таблицы из первого запроса. потому что они уже были переведены ранее.

.

Улучшение: запись файла и выполнение его в конце перевода вместо выполнения обновлений sql.

Если он слишком длинный и, возможно, будет слишком длинным, вместо непосредственного выполнения SQL-ОБНОВЛЕНИЙ, вы бы предпочли написать файл со всеми вашими обновлениями, и после того, как вы приступите к работе, перейдите к получению файла и используйте его в SQL .

.

Улучшение: многопоточная версия

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

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