Como saber se o registro foi alterado no Postgres

Eu tenho um tipo de pergunta "upsert" ... mas, eu quero jogar isso lá fora, porque é um pouco diferente de tudo que eu já li no stackoverflow.

Problema básico.

Estou trabalhando para migrar do mysql para o PostgreSQL 9.1.5 (hospedado no Heroku). Como parte disso, eu preciso importar vários arquivos CSV todos os dias. Alguns dos dados são informações de vendas e quase garantidamente são novos e precisam ser inseridos. Mas, outras partes dos dados são quase garantidas para ser o mesmo. Por exemplo, os arquivos csv (nota plural) terão informações de PDV (ponto de venda) neles. Isso raramente muda (e é mais provável apenas via adições). Depois, há informações sobre o produto. Existem cerca de 10.000 produtos (a grande maioria não será alterada, mas é possível ter tanto adições como atualizações).

O item final (mas é importante) é que eu tenho a obrigação de fornecer uma trilha / informação de auditoria para qualquer item. Por exemplo, se eu adicionar um novo registro POS, preciso rastreá-lo no arquivo em que ele foi encontrado. Se eu alterar um código UPC ou a descrição de um produto, preciso localizá-lo novamente. para a importação (e arquivo) de onde veio a mudança.

Solução que estou contemplando.

Como os dados são fornecidos para mim por meio do CSV, estou trabalhando em torno da ideia de que o COPY será o melhor / mais rápido. A estrutura dos dados nos arquivos não é exatamente o que eu tenho no banco de dados (ou seja, o destino final). Então, estou copiando-os em tabelas no esquema de preparação que correspondem ao CSV (note: um esquema por fonte de dados). As tabelas nos esquemas de preparação terão um antes de inserir gatilhos de linha. Esses gatilhos podem decidir o que fazer com os dados (inserir, atualizar ou ignorar).

Para as tabelas com maior probabilidade de conter novos dados, ele tentará inserir primeiro. Se o registro já estiver lá, ele retornará NULL (e interromperá a inserção na tabela de preparo). Para tabelas que raramente mudam, ele consultará a tabela e verá se o registro foi encontrado. Se for, então preciso de uma maneira de ver se algum dos campos é alterado. (porque lembre-se, eu preciso mostrar que o registro foi modificado por import x do arquivo y) Eu obviamente posso simplesmente escrever o código e testar cada coluna. Mas, procurava algo um pouco mais "eloqüente" e mais sustentável do que isso.

De certa forma, o que estou fazendo é combinar um sistema de importação com um sistema de trilha de auditoria. Então, ao pesquisar trilhas de auditoria, eu analisei as seguinteswiki.postgresql.org artigo. Parece que a hstore pode ser uma boa maneira de obter alterações (e ser capaz de ignorar facilmente algumas colunas da tabela que não são importantes, por exemplo, "last_modified")

Tenho cerca de 90% de certeza de que tudo vai funcionar ... Criei algumas tabelas de teste, etc. e brinquei com ela.

Minha pergunta?

É uma maneira melhor e mais sustentável de realizar essa tarefa de encontrar os talvez 3 registros de 10K que exigem uma alteração no banco de dados. Eu certamente poderia escrever um script python (ou qualquer outra coisa) que lê o arquivo e tenta descobrir o que fazer com cada registro, mas isso parece horrivelmente ineficiente e levará a muitas viagens de ida e volta.

Algumas coisas finais:

Eu não tenho controle sobre os arquivos de entrada. Eu adoraria se eles apenas me enviassem os deltas, mas eles não o fazem e está completamente fora do meu controle ou influência.O sistema está crescendo e novas fontes de dados provavelmente serão adicionadas, o que aumentará muito a quantidade de dados sendo processados ​​(por isso, estou tentando manter as coisas eficientes)Eu sei que isso não é legal, simples, SO pergunta (como "como classificar uma lista em python"), mas acredito que uma das grandes coisas sobre SO é que você pode fazer perguntas difíceis e as pessoas vão compartilhar seus pensamentos sobre como eles pensam A melhor maneira de resolver isso é.

questionAnswers(1)

yourAnswerToTheQuestion