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.

Importar JSONL em uma Coluna jsonb
-- Create a staging table with a single jsonb column
CREATE TABLE staging_import (data jsonb);
-- Import the JSONL file (each line becomes one row)
\COPY staging_import (data) FROM 'users.jsonl';
-- Verify the import
SELECT count(*) FROM staging_import;
SELECT data->>'name' AS name, data->>'email' AS email
FROM staging_import
LIMIT 5;
-- Move data into a structured table
INSERT INTO users (name, email, age)
SELECT
data->>'name',
data->>'email',
(data->>'age')::int
FROM 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.

Exportar Linhas PostgreSQL como JSONL
-- 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_at
FROM users
WHERE active = true
ORDER 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.

Script Python para Importacao Estruturada no PostgreSQL
import json
import psycopg2
from psycopg2.extras import execute_values
def import_jsonl_to_postgres(file_path, conn_string):
conn = psycopg2.connect(conn_string)
cur = conn.cursor()
batch = []
batch_size = 1000
total = 0
with open(file_path, 'r') as f:
for line_num, line in enumerate(f, 1):
line = line.strip()
if not line:
continue
try:
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}")
continue
if 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.")
# Usage
import_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.

Importar JSONL com mongoimport
# Basic import: each line becomes a document
mongoimport \
--uri="mongodb://localhost:27017/mydb" \
--collection=users \
--file=users.jsonl
# Upsert mode: update existing documents by _id
mongoimport \
--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 files
mongoimport \
--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.

Exportar MongoDB para JSONL com mongoexport
# Export entire collection as JSONL (default format)
mongoexport \
--uri="mongodb://localhost:27017/mydb" \
--collection=users \
--out=users_export.jsonl
# Export with query filter
mongoexport \
--uri="mongodb://localhost:27017/mydb" \
--collection=users \
--query={"active": true} \
--out=active_users.jsonl
# Export specific fields only
mongoexport \
--uri="mongodb://localhost:27017/mydb" \
--collection=users \
--fields=name,email,created_at \
--out=users_partial.jsonl
# Export with sorting
mongoexport \
--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.

Importar JSONL Usando Tabela de Staging e JSON_TABLE
-- Step 1: Create a staging table for raw lines
CREATE TABLE jsonl_staging (
id INT AUTO_INCREMENT PRIMARY KEY,
raw_line TEXT NOT NULL
);
-- Step 2: Load the JSONL file as raw text
LOAD DATA INFILE '/var/lib/mysql-files/users.jsonl'
INTO TABLE jsonl_staging
LINES TERMINATED BY '\n'
(raw_line);
-- Step 3: Extract structured data with JSON_TABLE
INSERT INTO users (name, email, age)
SELECT jt.name, jt.email, jt.age
FROM 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 table
DROP TABLE jsonl_staging;
-- Verify the import
SELECT * 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.

Script Python para Importacao JSONL no MySQL
import json
import mysql.connector
def import_jsonl_to_mysql(file_path, config):
conn = mysql.connector.connect(**config)
cursor = conn.cursor()
batch = []
batch_size = 1000
total = 0
insert_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:
continue
try:
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}")
continue
if 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.")
# Usage
import_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.

Script Python para Importacao JSONL no SQLite
import json
import sqlite3
def import_jsonl_to_sqlite(jsonl_path, db_path):
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# Create table if it doesn't exist
cursor.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 = 0
errors = 0
with open(jsonl_path, 'r') as f:
# Use a transaction for bulk insert performance
conn.execute('BEGIN TRANSACTION')
for line_num, line in enumerate(f, 1):
line = line.strip()
if not line:
continue
try:
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 += 1
except (json.JSONDecodeError, KeyError) as e:
errors += 1
print(f"Line {line_num}: {e}")
conn.commit()
conn.close()
print(f"Imported {total} records, {errors} errors")
# Usage
import_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

Desempenho

Nunca 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

Confiabilidade

Parse 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

Observabilidade

Para 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.

Padrao de Importacao em Lote Pronto para Producao
import json
import time
def 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_num
line = line.strip()
if not line:
stats['skipped'] += 1
continue
try:
record = json.loads(line)
batch.append(record)
except json.JSONDecodeError as e:
stats['errors'] += 1
error_file.write(f"{line_num}\t{e}\t{line}\n")
continue
if len(batch) >= batch_size:
inserted = insert_fn(batch)
stats['imported'] += inserted
batch = []
if line_num % 10000 == 0:
elapsed = time.time() - start_time
rate = stats['imported'] / elapsed
print(
f"Progress: {line_num:,} lines | "
f"{stats['imported']:,} imported | "
f"{rate:,.0f} records/sec"
)
# Flush remaining batch
if batch:
inserted = insert_fn(batch)
stats['imported'] += inserted
error_file.close()
elapsed = time.time() - start_time
print(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.

Trabalhe com Arquivos JSONL Online

Visualize, valide e converta arquivos JSONL de ate 1GB diretamente no seu navegador. Sem uploads necessarios, 100% privado.

Perguntas Frequentes

Importar/Exportar JSONL — PostgreSQL, MongoDB, BigQuery e...