Fase 2: Migracao da Camada de Dados (DAL)
12h 00min
18-19/12/2024 | Inicio: 16:30 | Termino: 04:30 (dia seguinte)
- Migracao de 598 entidades do Entity Framework 6 para EF Core 8
- Conversao de Data Annotations para Fluent API
- Configuracao de relacionamentos e chaves estrangeiras
- Mapeamento de Views como entidades sem chave (keyless)
- Adaptacao para PostgreSQL (tipos de dados, nomenclatura)
Atencao: Volume de Dados
O sistema possui 8 anos de operacao. Isso significa um volume significativo de dados.
Recomendamos fazer a importacao em etapas, por modulo/tabela, para evitar timeout e problemas de memoria.
Passo 1: Exportar Dados do SQL Server (AWS)
1.1 Conectar ao SQL Server na AWS
Use o SQL Server Management Studio (SSMS) ou Azure Data Studio para conectar:
Server: seu-servidor.rds.amazonaws.com
Database: COMPLY_Producao
User: seu_usuario
Password: sua_senha
1.2 Exportar tabelas para CSV
Execute o script abaixo para cada tabela principal:
-- Exemplo: Exportar Pessoas
SELECT * FROM tb_pessoa
-- Clique direito no resultado > Save Results As > CSV
-- Tabelas prioritarias:
-- tb_pessoa, tb_associado, tb_organizacao
-- tb_produto, tb_evento, tb_atendimento
-- tb_contribuicao, tb_titulo_receita
1.3 Alternativa: Usar BCP (Bulk Copy)
bcp "SELECT * FROM COMPLY_Producao.dbo.tb_pessoa" queryout "C:\export\tb_pessoa.csv" -c -t"," -S seu-servidor.rds.amazonaws.com -U usuario -P senha
Passo 2: Exportar Dados do MongoDB (AWS)
2.1 Usar mongoexport
# Instalar MongoDB Tools
# https://www.mongodb.com/try/download/database-tools
# Exportar colecoes
mongoexport --uri="mongodb://usuario:senha@seu-mongo.amazonaws.com:27017/comply" --collection=logs --out=logs.json
mongoexport --uri="mongodb://usuario:senha@seu-mongo.amazonaws.com:27017/comply" --collection=documentos --out=documentos.json
Passo 3: Fazer Upload para o Replit
3.1 Via Interface do Replit
- No painel esquerdo do Replit, clique em "Files"
- Crie uma pasta chamada "data_import"
- Arraste os arquivos CSV para essa pasta
- Para arquivos grandes (>50MB), use o metodo 3.2
3.2 Via AWS S3 + wget (arquivos grandes)
# No AWS S3, torne o arquivo temporariamente publico ou gere URL pre-assinada
# No terminal do Replit:
mkdir -p data_import
cd data_import
wget "https://seu-bucket.s3.amazonaws.com/tb_pessoa.csv?AWSAccessKeyId=xxx&Signature=yyy&Expires=zzz"
Passo 4: Importar para PostgreSQL
4.1 Usar COPY do PostgreSQL
-- Conectar ao PostgreSQL do Replit
-- Use as variaveis de ambiente: PGHOST, PGPORT, PGDATABASE, PGUSER, PGPASSWORD
-- Criar tabela temporaria para staging
CREATE TEMP TABLE staging_pessoa (
id INT,
nome VARCHAR(255),
documento VARCHAR(50),
-- ... outras colunas conforme CSV
);
-- Importar CSV
\COPY staging_pessoa FROM '/home/runner/workspace/data_import/tb_pessoa.csv' WITH CSV HEADER;
-- Inserir na tabela definitiva
INSERT INTO tb_pessoa (id, nome, documento, ...)
SELECT id, nome, documento, ...
FROM staging_pessoa
ON CONFLICT (id) DO UPDATE SET
nome = EXCLUDED.nome,
documento = EXCLUDED.documento;
4.2 Script Python para importacao em lotes
import pandas as pd
import psycopg2
from psycopg2.extras import execute_values
import os
conn = psycopg2.connect(
host=os.environ['PGHOST'],
port=os.environ['PGPORT'],
database=os.environ['PGDATABASE'],
user=os.environ['PGUSER'],
password=os.environ['PGPASSWORD']
)
# Ler CSV em chunks de 10000 linhas
for chunk in pd.read_csv('data_import/tb_pessoa.csv', chunksize=10000):
data = [tuple(x) for x in chunk.to_numpy()]
cursor = conn.cursor()
execute_values(cursor, """
INSERT INTO tb_pessoa (id, nome, documento, email, ...)
VALUES %s
ON CONFLICT (id) DO UPDATE SET
nome = EXCLUDED.nome
""", data)
conn.commit()
print(f"Importado {len(data)} registros")
conn.close()
Dicas para Grandes Volumes
- Divida por ano: Exporte dados de cada ano separadamente
- Comece pelos cadastros base: Pessoas, Organizacoes, Usuarios primeiro
- Depois transacionais: Contribuicoes, Atendimentos, Eventos
- Por ultimo: Logs, Historicos, Arquivos
- Valide a cada etapa: Confira contagem de registros
- Limite do Replit: Se necessario, use VM externa para processar e depois sincronizar
Passo 5: Validacao
5.1 Conferir contagem de registros
-- No SQL Server (origem)
SELECT 'tb_pessoa' as tabela, COUNT(*) as total FROM tb_pessoa
UNION ALL
SELECT 'tb_associado', COUNT(*) FROM tb_associado
UNION ALL
SELECT 'tb_evento', COUNT(*) FROM tb_evento;
-- No PostgreSQL (destino)
SELECT 'tb_pessoa' as tabela, COUNT(*) as total FROM tb_pessoa
UNION ALL
SELECT 'tb_associado', COUNT(*) FROM tb_associado
UNION ALL
SELECT 'tb_evento', COUNT(*) FROM tb_evento;
5.2 Verificar integridade referencial
-- Verificar associados sem pessoa
SELECT COUNT(*) FROM tb_associado a
LEFT JOIN tb_pessoa p ON a."idPessoa" = p.id
WHERE p.id IS NULL;
-- Deve retornar 0