Importacao e Exportacao JSONL para Bancos de Dados: PostgreSQL, MongoDB e Mais
Um guia abrangente para importar arquivos JSONL em bancos de dados e exportar registros de banco de dados como JSONL. Abrange comandos COPY do PostgreSQL, ferramentas CLI do MongoDB, JSON_TABLE do MySQL, scripts SQLite e padroes de importacao em massa prontos para producao.
Ultima atualizacao: fevereiro de 2026
Por que Usar JSONL para Importacao e Exportacao de Bancos de Dados?
JSONL (JSON Lines) se tornou um formato preferido para mover dados entre bancos de dados e sistemas externos. Cada linha e um objeto JSON independente e autocontido, o que significa que voce pode fazer streaming de registros um por vez sem carregar o dataset inteiro na memoria. Isso e critico quando voce esta migrando milhoes de linhas entre instancias PostgreSQL, sincronizando colecoes MongoDB com um data warehouse ou alimentando exportacoes de banco de dados em pipelines de aprendizado de maquina.
Comparado ao CSV, o JSONL preserva tipos de dados, suporta objetos aninhados e arrays, e elimina a ambiguidade de escape de delimitadores. Um arquivo JSONL pode carregar uma coluna PostgreSQL jsonb exatamente como esta, enquanto CSV exigiria que voce achatasse ou escapasse a estrutura aninhada. Comparado a um array JSON completo, JSONL e transmissivel: voce pode processar, validar ou transformar cada registro no momento em que e lido, em vez de esperar o arquivo inteiro ser parseado.
Todo sistema de banco de dados importante agora tem ferramentas para JSONL. PostgreSQL pode copiar linhas atraves de conversao jsonb, MongoDB vem com mongoimport e mongoexport que usam JSONL por padrao, MySQL 8.0 adicionou JSON_TABLE para extracao estruturada e SQLite tem uma extensao JSON1. Nas secoes seguintes, voce aprendera os comandos exatos, scripts e boas praticas para cada banco de dados.
PostgreSQL: Importar e Exportar JSONL
PostgreSQL oferece varias abordagens para trabalhar com JSONL. O comando COPY fornece o caminho mais rapido de importacao em massa, enquanto o tipo de dado jsonb permite armazenar e consultar dados semi-estruturados nativamente. Para tabelas estruturadas, voce pode parsear campos JSONL em colunas tipadas durante a importacao.
A maneira mais rapida de importar JSONL no PostgreSQL e carregar cada linha como um valor jsonb usando o comando COPY. Crie uma tabela com uma unica coluna jsonb, depois use COPY FROM para fazer streaming do arquivo diretamente no banco de dados.
-- Create a staging table with a single jsonb columnCREATE TABLE staging_import (data jsonb);-- Import the JSONL file (each line becomes one row)\COPY staging_import (data) FROM 'users.jsonl';-- Verify the importSELECT count(*) FROM staging_import;SELECT data->>'name' AS name, data->>'email' AS emailFROM staging_importLIMIT 5;-- Move data into a structured tableINSERT INTO users (name, email, age)SELECTdata->>'name',data->>'email',(data->>'age')::intFROM staging_import;
Para exportar dados como JSONL, use row_to_json() ou to_jsonb() para converter cada linha em um objeto JSON, depois use COPY para gravar o resultado em um arquivo. Cada linha se torna uma linha no arquivo de saida.
-- Export entire table as JSONL\COPY (SELECT row_to_json(t)FROM (SELECT id, name, email, created_at FROM users) t) TO 'users_export.jsonl';-- Export with filtering and transformation\COPY (SELECT row_to_json(t)FROM (SELECT id, name, email,created_at::text AS created_atFROM usersWHERE active = trueORDER BY id) t) TO 'active_users.jsonl';-- Verify: each line is valid JSON-- {"id":1,"name":"Alice","email":"alice@example.com",...}
Para cargas de trabalho de producao, use um script Python com psycopg2 para ler um arquivo JSONL e inserir registros em colunas tipadas. Isso da controle total sobre validacao, tratamento de erros e tamanho de lotes.
import jsonimport psycopg2from psycopg2.extras import execute_valuesdef import_jsonl_to_postgres(file_path, conn_string):conn = psycopg2.connect(conn_string)cur = conn.cursor()batch = []batch_size = 1000total = 0with open(file_path, 'r') as f:for line_num, line in enumerate(f, 1):line = line.strip()if not line:continuetry:record = json.loads(line)batch.append((record['name'],record['email'],record.get('age'),))except (json.JSONDecodeError, KeyError) as e:print(f"Skipping line {line_num}: {e}")continueif len(batch) >= batch_size:execute_values(cur,"INSERT INTO users (name, email, age) ""VALUES %s ON CONFLICT (email) DO NOTHING",batch)total += len(batch)batch = []print(f"Imported {total} records...")if batch:execute_values(cur,"INSERT INTO users (name, email, age) ""VALUES %s ON CONFLICT (email) DO NOTHING",batch)total += len(batch)conn.commit()cur.close()conn.close()print(f"Done. Imported {total} records.")# Usageimport_jsonl_to_postgres('users.jsonl', 'postgresql://localhost/mydb')
MongoDB: Suporte Nativo a JSONL
MongoDB tem suporte de primeira classe a JSONL atraves de suas ferramentas de linha de comando Database Tools. Os utilitarios mongoimport e mongoexport usam o formato JSONL por padrao, tornando o MongoDB um dos bancos de dados mais faceis para trabalhar com troca de dados JSONL. Cada linha em um arquivo JSONL mapeia diretamente para um documento MongoDB.
mongoimport le um arquivo JSONL e insere cada linha como um documento na colecao especificada. Suporta modo upsert, coercao de tipo de campo e insercao paralela para alto throughput.
# Basic import: each line becomes a documentmongoimport \--uri="mongodb://localhost:27017/mydb" \--collection=users \--file=users.jsonl# Upsert mode: update existing documents by _idmongoimport \--uri="mongodb://localhost:27017/mydb" \--collection=users \--file=users.jsonl \--mode=upsert \--upsertFields=email# Drop collection before import (clean slate)mongoimport \--uri="mongodb://localhost:27017/mydb" \--collection=users \--file=users.jsonl \--drop# Import with parallel workers for large filesmongoimport \--uri="mongodb://localhost:27017/mydb" \--collection=users \--file=large_users.jsonl \--numInsertionWorkers=4
mongoexport escreve cada documento de uma colecao como uma unica linha JSON. Voce pode filtrar, projetar e ordenar a saida. O resultado e um arquivo JSONL valido pronto para processamento por qualquer sistema downstream.
# Export entire collection as JSONL (default format)mongoexport \--uri="mongodb://localhost:27017/mydb" \--collection=users \--out=users_export.jsonl# Export with query filtermongoexport \--uri="mongodb://localhost:27017/mydb" \--collection=users \--query={"active": true} \--out=active_users.jsonl# Export specific fields onlymongoexport \--uri="mongodb://localhost:27017/mydb" \--collection=users \--fields=name,email,created_at \--out=users_partial.jsonl# Export with sortingmongoexport \--uri="mongodb://localhost:27017/mydb" \--collection=users \--sort={"created_at": -1} \--out=users_sorted.jsonl
MySQL: JSONL com JSON_TABLE e Scripts
MySQL nao tem um comando de importacao JSONL integrado como o MongoDB, mas o MySQL 8.0 introduziu JSON_TABLE que permite extrair dados estruturados de strings JSON. Para importacao em massa de JSONL, a abordagem mais confiavel combina LOAD DATA INFILE para carregamento bruto com JSON_TABLE para extracao, ou usa uma linguagem de script como Python.
Carregue o arquivo JSONL como texto bruto em uma tabela de staging, depois use JSON_TABLE para extrair campos em uma tabela estruturada. Essa abordagem em duas etapas funciona inteiramente dentro do MySQL.
-- Step 1: Create a staging table for raw linesCREATE TABLE jsonl_staging (id INT AUTO_INCREMENT PRIMARY KEY,raw_line TEXT NOT NULL);-- Step 2: Load the JSONL file as raw textLOAD DATA INFILE '/var/lib/mysql-files/users.jsonl'INTO TABLE jsonl_stagingLINES TERMINATED BY '\n'(raw_line);-- Step 3: Extract structured data with JSON_TABLEINSERT INTO users (name, email, age)SELECT jt.name, jt.email, jt.ageFROM jsonl_staging,JSON_TABLE(raw_line, '$'COLUMNS (name VARCHAR(255) PATH '$.name',email VARCHAR(255) PATH '$.email',age INT PATH '$.age')) AS jt;-- Step 4: Clean up staging tableDROP TABLE jsonl_staging;-- Verify the importSELECT * FROM users LIMIT 5;
Para mais flexibilidade, use um script Python com mysql-connector-python para ler um arquivo JSONL e fazer insercao em lote de registros. Essa abordagem lida com arquivos grandes de forma eficiente e fornece relatorio detalhado de erros.
import jsonimport mysql.connectordef import_jsonl_to_mysql(file_path, config):conn = mysql.connector.connect(**config)cursor = conn.cursor()batch = []batch_size = 1000total = 0insert_sql = ("INSERT INTO users (name, email, age) ""VALUES (%s, %s, %s) ""ON DUPLICATE KEY UPDATE name=VALUES(name)")with open(file_path, 'r') as f:for line_num, line in enumerate(f, 1):line = line.strip()if not line:continuetry:record = json.loads(line)batch.append((record['name'],record['email'],record.get('age'),))except (json.JSONDecodeError, KeyError) as e:print(f"Skipping line {line_num}: {e}")continueif len(batch) >= batch_size:cursor.executemany(insert_sql, batch)conn.commit()total += len(batch)batch = []print(f"Imported {total} records...")if batch:cursor.executemany(insert_sql, batch)conn.commit()total += len(batch)cursor.close()conn.close()print(f"Done. Imported {total} records.")# Usageimport_jsonl_to_mysql('users.jsonl', {'host': 'localhost','user': 'root','password': 'secret','database': 'mydb'})
SQLite: Importacao JSONL Leve
SQLite e uma excelente escolha para desenvolvimento local e datasets menores. Embora o SQLite nao tenha um comando de importacao JSONL nativo, sua extensao JSON1 fornece json_extract() para trabalhar com dados JSON, e um simples script Python pode importar arquivos JSONL de forma eficiente usando o suporte a transacoes integrado do SQLite.
Use o modulo sqlite3 integrado do Python para ler um arquivo JSONL e inserir registros em um banco de dados SQLite. Envolver todas as insercoes em uma unica transacao melhora dramaticamente o desempenho para arquivos grandes.
import jsonimport sqlite3def import_jsonl_to_sqlite(jsonl_path, db_path):conn = sqlite3.connect(db_path)cursor = conn.cursor()# Create table if it doesn't existcursor.execute("""CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,email TEXT UNIQUE,age INTEGER,raw_json TEXT)""")total = 0errors = 0with open(jsonl_path, 'r') as f:# Use a transaction for bulk insert performanceconn.execute('BEGIN TRANSACTION')for line_num, line in enumerate(f, 1):line = line.strip()if not line:continuetry:record = json.loads(line)cursor.execute("INSERT OR IGNORE INTO users ""(name, email, age, raw_json) ""VALUES (?, ?, ?, ?)",(record['name'],record.get('email'),record.get('age'),line, # Store original JSON))total += 1except (json.JSONDecodeError, KeyError) as e:errors += 1print(f"Line {line_num}: {e}")conn.commit()conn.close()print(f"Imported {total} records, {errors} errors")# Usageimport_jsonl_to_sqlite('users.jsonl', 'app.db')# Query with json_extract (SQLite JSON1 extension)# SELECT json_extract(raw_json, '$.name') FROM users;
Boas Praticas para Importacao em Massa
Importar arquivos JSONL grandes em um banco de dados requer atencao cuidadosa a transacoes, tratamento de erros e gerenciamento de recursos. Essas boas praticas se aplicam a todos os sistemas de banco de dados e ajudarao voce a construir pipelines de importacao confiaveis e prontos para producao.
Transacoes em Lote
DesempenhoNunca insira uma linha por transacao. Agrupe insercoes em lotes de 500-5000 linhas por transacao. Isso reduz I/O de disco e overhead de locks em 10-100x. A maioria dos bancos de dados ve os maiores ganhos com tamanhos de lote de 1000. Ir alem oferece retornos decrescentes e aumenta o custo de um rollback se algo falhar.
Tratamento de Erros por Linha
ConfiabilidadeParse e valide cada linha JSONL individualmente. Registre o numero da linha e a mensagem de erro para qualquer linha que falhar na validacao ou insercao. Use ON CONFLICT / ON DUPLICATE KEY para lidar com violacoes de restricao unica de forma elegante em vez de abortar toda a importacao. Salve linhas com falha em um arquivo de erros separado para revisao posterior.
Rastreamento de Progresso
ObservabilidadePara arquivos com milhoes de linhas, registre o progresso a cada N registros (por exemplo, a cada 10.000). Rastreie o total de linhas lidas, insercoes bem-sucedidas, duplicatas ignoradas e erros. Calcule e exiba a taxa de importacao (registros/segundo) para identificar gargalos de desempenho. Esse feedback e essencial para monitorar importacoes de longa duracao.
Este padrao generico combina agrupamento em lotes, tratamento de erros e rastreamento de progresso. Adapte-o para qualquer banco de dados substituindo a funcao de insercao.
import jsonimport timedef batch_import_jsonl(file_path, insert_fn, batch_size=1000):"""Generic JSONL batch importer with error handling."""batch = []stats = {'total_lines': 0,'imported': 0,'skipped': 0,'errors': 0}start_time = time.time()error_file = open(file_path + '.errors', 'w')with open(file_path, 'r') as f:for line_num, line in enumerate(f, 1):stats['total_lines'] = line_numline = line.strip()if not line:stats['skipped'] += 1continuetry:record = json.loads(line)batch.append(record)except json.JSONDecodeError as e:stats['errors'] += 1error_file.write(f"{line_num}\t{e}\t{line}\n")continueif len(batch) >= batch_size:inserted = insert_fn(batch)stats['imported'] += insertedbatch = []if line_num % 10000 == 0:elapsed = time.time() - start_timerate = stats['imported'] / elapsedprint(f"Progress: {line_num:,} lines | "f"{stats['imported']:,} imported | "f"{rate:,.0f} records/sec")# Flush remaining batchif batch:inserted = insert_fn(batch)stats['imported'] += insertederror_file.close()elapsed = time.time() - start_timeprint(f"\nComplete in {elapsed:.1f}s")print(f" Lines: {stats['total_lines']:,}")print(f" Imported: {stats['imported']:,}")print(f" Errors: {stats['errors']:,}")return stats
Prepare Seus Dados com Ferramentas JSONL Gratuitas
Antes de importar JSONL no seu banco de dados, valide o formato do arquivo e converta entre formatos. Nossas ferramentas online gratuitas processam tudo localmente no seu navegador, entao seus dados nunca saem da sua maquina.