Preenchendo campos em registros existentes no postgresql usando o ID do registro para determinar o que vai onde

1

O cenário

Eu tenho um banco de dados postgresql contendo uma lista de variantes de produtos, que foi preenchida automaticamente, sem os números de peça. Eu exportei a tabela para executar algumas fórmulas para gerar os números de peça para cada variante do produto. Isso me deu uma tabela contendo o ID do registro relevante e o número de parte associado.

O que estou tentando realizar

Agora que tenho minha tabela com as informações que estão faltando, como obtenho essas informações novamente na tabela postgresql?

Dados de amostra da tabela Postgresql [product_product]

   id   create_date       weight    default_code     product_templ_id   ...
    1   2016-12-15 18:57       0    000-000000-000                  1   ...
    2   2016-12-16 19:00       0    000-000000-000                  2   ...
    3   2016-12-16 20:42       0    000-000000-000                 31   ...
    4   2016-12-16 20:43       0    000-000000-000                 31   ...
    5   2016-12-16 20:44       0    000-000000-000                 31   ...
    6   2016-12-16 20:45       0                                   31   ...
  ...   ................     ...    ..............                 31   ...
 1603   2016-12-16 21:51       0                                   31   ...
 1604   2016-12-16 21:52       0                                   31   ...

Lista de exemplos de números de peça calculados

  id  default_code  
   6  000-000000-000
 ...  ..............
1604  000-000000-000

O que eu tentei

Bem, eu configurei uma conexão ODBC para o banco de dados, vinculando a tabela no MS Access 2010. Filtrei para o campo product_templ_id e classifiquei por id , para corresponder ao que eu tinha na planilha do Excel. Em seguida, copiei os números de peça da coluna default_code e tentei colar no ponto inicial, mas recebi um erro informando que eu estava tentando colar muita informação. Eu entendo, o Access estava tentando colar o conteúdo da área de transferência na única célula. Não o comportamento pelo qual eu estava esperando.

Qual é o melhor caminho?

Este produto em particular tem 1440 variantes, cada uma com seu próprio número de peça e BOM. Eu realmente não quero gastar meu tempo gerando tudo isso linha por linha. Estou sempre dizendo às pessoas que dados são dados e você pode fazer qualquer coisa com dados. É só uma questão de descobrir como.

- EDITAR

Eu posso exportar minha tabela do pgAdmin, mas, por algum motivo, quando tento importar, nada acontece.

Como resultado, tentei o seguinte comando:

COPY product_product (default_code) from '/csv/file/location/file.csv' CSV HEADER delimiter ';' null '/n';

O que resultou em:

ERROR:  extra data after last expected column
CONTEXT:  COPY product_product, line 2: "203;000-000000-000"

Eu acho, ok, eu menciono um campo, mas meu csv tem dois campos. Isso porque quero garantir que o campo default_code importado esteja associado ao registro adequado.

Em seguida, tentei:

COPY product_product FROM '/csv/file/location/file.csv' CSV HEADER delimiter ';' null '\n';

Como resultado:

ERROR:  duplicate key value violates unique constraint "product_product_pkey"
DETAIL:  Key (id)=(2) already exists.

Então, agora, acho que também posso largar a mesa e reconstruí-la. Infelizmente, existem dependências de configuração com esta tabela, por isso não pode ser descartado.

Se eu soubesse como editar um valor de registro no postgresql, eu poderia escrever um script para gerar os comandos necessários para editar todos os 1440 registros adequadamente.

    
por Sirach Matthews 09.01.2017 / 05:38

1 resposta

1

Você deve exportar seus dados no formato CSV e usar pgAdmin ou um comando COPY bruto no postgres para importar seus dados de volta:

Veja este post para informações sobre como fazer isso: link

- EDITAR

Seguindo este post , você pode usar suas habilidades de script para gerar a seguinte consulta SQL:

UPDATE product_product
    SET default_code = CASE id
        WHEN 6 THEN 000-000000-000
        ...
        ...
        WHEN 1603 THEN 000-000000-000
        WHEN 1604 THEN 000-000000-000
        ELSE default_code
        END;

Em seguida, usando o pgAdmin, conecte-se ao seu banco de dados e execute a consulta. Isso analisará os registros na tabela product_product e atualizará o campo default_code do registro correspondente ao valor id relativo. Se o valor id não estiver na sua lista, ele simplesmente manterá o valor default_code .

Esta postagem encerra a consulta com uma declaração adicional:

        ...
        END
    WHERE id IN(6,...,...,1603,1604);

Neste caso particular, não é necessário listar os valores específicos de id . Além disso, uma lista IN de mais de 1440 valores gerará um erro. Tudo bem, porque a declaração ELSE default_code age como um atributo, manipulando os valores id não em nossa lista case .

Esta solução foi testada e verificada pelo OP.

    
por 09.01.2017 / 05:43