Pergunta

Eu tenho uma fonte de dados que fornece uma lista de objetos e suas propriedades (um arquivo CSV, mas isso não faz diferença). Cada vez que meu programa é executado, ele precisa puxar uma nova cópia da lista de objetos, compará-lo à lista de objetos (e suas propriedades) armazenados no banco de dados e atualizar o banco de dados, conforme necessário.

Lidar com novos objetos é fácil - a fonte de dados dá a cada objeto um número de identificação seqüencial, verifique o número de ID de topo na nova informação no banco de dados, e está feito. Estou à procura de sugestões para os outros casos -. Quando algumas das propriedades de um objeto mudaram, ou quando um objeto foi suprimido

Uma solução ingênua seria retirar todos os objetos do banco de dados e obter o complemento da interseção dos dois conjuntos (velho e novo) e, em seguida, examinar esses resultados, mas que parece que não seria muito eficiente se os conjuntos obter grande. Alguma idéia?

Foi útil?

Solução

A abordagem padrão para pilhas enormes de dados equivale a isso.

Vamos supor que list_1 é o "mestre" (sem duplicatas) e list_2 é "atualizações" que pode ter duplicatas.

iter_1 = iter( sorted(list_1) ) # Essentially SELECT...ORDER BY
iter_2 = iter( sorted(list_2) )
eof_1 = False
eof_2 = False
try:
    item_1 = iter_1.next()
except StopIteration:
    eof_1= True
try:
    item_2 = iter_2.next()
except StopIteration:
    eof_2= True
while not eof_1 and not eof_2:
    if item_1 == item_2:
        # do your update to create the new master list.
        try:
            item_2 = iter_2.next()
        except StopIteration:
            eof_2= True
    elif item_1 < item_2:
        try:
            item_1 = iter_1.next()
        except StopIteration:
            eof_1= True
    elif item_2 < item_1:
        # Do your insert to create the new master list.
        try:
            item_2 = iter_2.next()
        except StopIteration:
            eof_2= True
assert eof_1 or eof_2
if eof_1:
    # item_2 and the rest of list_2 are inserts.
elif eof_2:
    pass
else:
    raise Error("What!?!?") 

Sim, envolve uma espécie potencial. Se list_1 é mantido em ordem de classificação quando você escrevê-lo de volta para o sistema de arquivos, que economiza tempo considerável. Se list_2 podem ser acumulados em uma estrutura que mantém ordenados, em seguida, que economiza tempo considerável.

Desculpe o palavrório, mas você precisa saber que iterador levantou a StopIteration, para que você não pode (trivialmente) envolva toda while em um bloco-old-try grande.

Outras dicas

Não há nenhuma maneira de manter uma "última vez modificado" campo? Isso é o que parece que você está realmente procurando por:. Um backup incremental, com base no último backup tempo foi executado, em comparação com última vez que um objeto foi mudado / suprimido (/ acrescentou)

Você precisa ter marcas de tempo, tanto o seu banco de dados e seu arquivo CSV. Timestamp deve mostrar os dados quando o registro foi atualizado e você deve comparar timestamps do registro com as mesmas IDs para decidir se você precisa atualizá-lo ou não

Quanto à sua idéia sobre interseção ... Deve ser feito vice-versa! Você tem que importar todos os dados do CSV para a tabela temporária e fazer interseção entre tabelas de banco de dados SQL 2. Se você usar o Oracle ou MS SQL 2008 (não tenho certeza para 2005), você vai encontrar uma palavra-chave MERGE muito útil, assim você pode escrever SQL com menos esforços, então você vai gastar para mesclar dados em outra linguagem de programação.

Quando você puxa a lista em seu programa, iterar sobre a lista fazendo uma consulta com base em uma propriedade de coluna na tabela de banco de dados que mapeia para a mesma propriedade do objeto da lista como ObjectName. Ou você pode carregar toda a tabela em uma lista e comparar a lista dessa maneira. I supondo que você tem algo único sobre o objeto que existe além do ID os cessionários de banco de dados.

Se o objeto não for encontrado na tabela por meio da consulta, criar uma nova entrada. Se for encontrado como FogleBird mencionado, tem um hash computadorizada ou CRC armazenado para esse objeto na tabela que você pode comparar com o objeto na lista (computação prazo sobre o objeto). Se os hashes não correspondem, atualizar esse objeto com o um na lista.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top