Попался при массовой загрузке CouchDB - PullRequest
8 голосов
/ 14 января 2009

В MSSQL 2005 у меня есть ~ 15 тыс. Строк, которые я хочу перенести в CouchDB, где одна строка - это один документ. У меня есть CLR-UDF, который записывает n строк в XML-файл с привязкой к схеме. У меня есть XSL-преобразование, которое преобразует привязанный к схеме XML в JSON.

С этими существующими инструментами я думаю, что могу перейти с MSSQL на XML в JSON. Если я пакетирую n строк для каждого файла JSON, я могу написать сценарий cURL для циклического прохождения файлов и отправки их в CouchDB с помощью массового API _bulk_docs.

Будет ли это работать? Кто-нибудь делал такую ​​миграцию раньше? Можете ли вы порекомендовать лучший способ?

1 Ответ

6 голосов
/ 20 января 2009

До сих пор я делал некоторые преобразования из устаревших баз данных SQL в CouchDB. У меня всегда был несколько иной подход.

  1. Я использовал первичный ключ SQL-DB в качестве Document-Id. Это позволило мне импортировать снова и снова, не опасаясь дубликатов документов.
  2. Я выполнял построчный импорт вместо массового импорта. Это облегчает отладку. Я видел между 5-10 вставками в секунду через интернет-соединение. Хотя это не молниеносно, для меня это было достаточно быстро. Моя самая большая база данных - 600 000 документов общим объемом 20 ГБ. строка за строкой увеличивает объем базы данных во время импорта, поэтому время от времени выполняйте уплотнение. Опять же, если ваши строки не огромные 15.000 строк звучит не так много.

Мой код импорта обычно выглядит так:

def main():
 options = parse_commandline()
 server = couchdb.client.Server(options.couch) 
 db = server[options.db] 
 for kdnnr in get_kundennumemrs():
    data = vars(get_kunde(kdnnr)) 
    doc = {'name1': data.get('name1', ''),
           'strasse': data.get('strasse', ''),
           'plz': data.get('plz', ''), 'ort': data.get('ort', ''),
           'tel': data.get('tel', ''), 'kundennr': data.get('kundennr', '')}

    # update existing doc or insert a new one
    newdoc = db.get(kdnnr, {})
    newdoc.update(doc)
    if newdoc != db.get(kdnnr, {}):
        db[kdnnr] = newdoc 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...