JSONL-Datenbankimport & -export: PostgreSQL, MongoDB & mehr

Eine umfassende Anleitung zum Importieren von JSONL-Dateien in Datenbanken und zum Exportieren von Datenbankdatensatzen als JSONL. Behandelt PostgreSQL COPY-Befehle, MongoDB CLI-Tools, MySQL JSON_TABLE, SQLite-Skripte und produktionsreife Massenimport-Muster.

Zuletzt aktualisiert: Februar 2026

Warum JSONL fur Datenbankimport & -export verwenden?

JSONL (JSON Lines) hat sich zu einem bevorzugten Format fur den Datenaustausch zwischen Datenbanken und externen Systemen entwickelt. Jede Zeile ist ein unabhangiges, eigenstandiges JSON-Objekt, was bedeutet, dass Sie Datensatze einzeln streamen konnen, ohne den gesamten Datensatz in den Speicher laden zu mussen. Dies ist entscheidend, wenn Sie Millionen von Zeilen zwischen PostgreSQL-Instanzen migrieren, MongoDB-Collections mit einem Data Warehouse synchronisieren oder Datenbankexporte in Machine-Learning-Pipelines einspeisen.

Im Vergleich zu CSV bewahrt JSONL Datentypen, unterstutzt verschachtelte Objekte und Arrays und beseitigt die Mehrdeutigkeit der Trennzeichen-Maskierung. Eine JSONL-Datei kann eine PostgreSQL jsonb-Spalte genau so ubertragen, wie sie ist, wahrend CSV erfordern wurde, die verschachtelte Struktur zu glatten oder zu maskieren. Im Vergleich zu einem vollstandigen JSON-Array ist JSONL streambar: Sie konnen jeden Datensatz in dem Moment verarbeiten, validieren oder transformieren, in dem er gelesen wird, anstatt auf das Parsen der gesamten Datei zu warten.

Jedes grosse Datenbanksystem verfugt mittlerweile uber Werkzeuge fur JSONL. PostgreSQL kann Zeilen uber jsonb-Casting mit COPY verarbeiten, MongoDB wird mit mongoimport und mongoexport ausgeliefert, die standardmassig JSONL verwenden, MySQL 8.0 hat JSON_TABLE fur strukturierte Extraktion hinzugefugt, und SQLite verfugt uber eine JSON1-Erweiterung. In den folgenden Abschnitten lernen Sie die genauen Befehle, Skripte und Best Practices fur jede Datenbank.

PostgreSQL: JSONL importieren & exportieren

PostgreSQL bietet mehrere Ansatze fur die Arbeit mit JSONL. Der COPY-Befehl bietet den schnellsten Pfad fur Massenimporte, wahrend der jsonb-Datentyp es Ihnen ermoglicht, semi-strukturierte Daten nativ zu speichern und abzufragen. Fur strukturierte Tabellen konnen Sie JSONL-Felder wahrend des Imports in typisierte Spalten parsen.

Der schnellste Weg, JSONL in PostgreSQL zu importieren, besteht darin, jede Zeile als jsonb-Wert mit dem COPY-Befehl zu laden. Erstellen Sie eine Tabelle mit einer einzelnen jsonb-Spalte und verwenden Sie dann COPY FROM, um die Datei direkt in die Datenbank zu streamen.

JSONL in eine jsonb-Spalte importieren
-- 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;

Um Daten als JSONL zu exportieren, verwenden Sie row_to_json() oder to_jsonb(), um jede Zeile in ein JSON-Objekt zu konvertieren, und dann COPY, um das Ergebnis in eine Datei zu schreiben. Jede Zeile wird zu einer Zeile in der Ausgabedatei.

PostgreSQL-Zeilen als JSONL exportieren
-- 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",...}

Fur Produktions-Workloads verwenden Sie ein Python-Skript mit psycopg2, um eine JSONL-Datei zu lesen und Datensatze in typisierte Spalten einzufugen. Dies gibt Ihnen volle Kontrolle uber Validierung, Fehlerbehandlung und Batch-Grossen.

Python-Skript fur strukturierten PostgreSQL-Import
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: Native JSONL-Unterstutzung

MongoDB verfugt uber erstklassige JSONL-Unterstutzung durch seine Kommandozeilen-Database-Tools. Die Dienstprogramme mongoimport und mongoexport verwenden standardmassig das JSONL-Format, was MongoDB zu einer der einfachsten Datenbanken fur den JSONL-Datenaustausch macht. Jede Zeile in einer JSONL-Datei wird direkt auf ein MongoDB-Dokument abgebildet.

mongoimport liest eine JSONL-Datei und fugt jede Zeile als Dokument in die angegebene Collection ein. Es unterstutzt den Upsert-Modus, Feldtyp-Konvertierung und paralleles Einfugen fur hohen Durchsatz.

JSONL mit mongoimport importieren
# 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 schreibt jedes Dokument einer Collection als einzelne JSON-Zeile. Sie konnen die Ausgabe filtern, projizieren und sortieren. Das Ergebnis ist eine gultige JSONL-Datei, die fur die Verarbeitung durch jedes nachgelagerte System bereit ist.

MongoDB als JSONL mit mongoexport exportieren
# 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 mit JSON_TABLE & Skripten

MySQL verfugt nicht uber einen integrierten JSONL-Importbefehl wie MongoDB, aber MySQL 8.0 hat JSON_TABLE eingefuhrt, mit dem Sie strukturierte Daten aus JSON-Strings extrahieren konnen. Fur den Massen-JSONL-Import ist der zuverlassigste Ansatz eine Kombination aus LOAD DATA INFILE fur das Rohladen und JSON_TABLE fur die Extraktion, oder die Verwendung einer Skriptsprache wie Python.

Laden Sie die JSONL-Datei als Rohtext in eine Staging-Tabelle und verwenden Sie dann JSON_TABLE, um Felder in eine strukturierte Tabelle zu extrahieren. Dieser zweistufige Ansatz funktioniert vollstandig innerhalb von MySQL.

JSONL mit Staging-Tabelle & JSON_TABLE importieren
-- 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;

Fur mehr Flexibilitat verwenden Sie ein Python-Skript mit mysql-connector-python, um eine JSONL-Datei zu lesen und Datensatze stapelweise einzufugen. Dieser Ansatz verarbeitet grosse Dateien effizient und bietet detaillierte Fehlerberichte.

Python-Skript fur MySQL-JSONL-Import
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: Leichtgewichtiger JSONL-Import

SQLite ist eine ausgezeichnete Wahl fur die lokale Entwicklung und kleinere Datensatze. Obwohl SQLite keinen nativen JSONL-Importbefehl hat, bietet die JSON1-Erweiterung json_extract() fur die Arbeit mit JSON-Daten, und ein einfaches Python-Skript kann JSONL-Dateien effizient mit der integrierten Transaktionsunterstutzung von SQLite importieren.

Verwenden Sie Pythons integriertes sqlite3-Modul, um eine JSONL-Datei zu lesen und Datensatze in eine SQLite-Datenbank einzufugen. Das Umschliessen aller Einfugungen in einer einzigen Transaktion verbessert die Leistung bei grossen Dateien erheblich.

Python-Skript fur SQLite-JSONL-Import
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;

Best Practices fur den Massenimport

Der Import grosser JSONL-Dateien in eine Datenbank erfordert besondere Aufmerksamkeit fur Transaktionen, Fehlerbehandlung und Ressourcenmanagement. Diese Best Practices gelten fur alle Datenbanksysteme und helfen Ihnen beim Aufbau zuverlassiger, produktionsreifer Import-Pipelines.

Batch-Transaktionen

Leistung

Fugen Sie niemals eine Zeile pro Transaktion ein. Gruppieren Sie Einfugungen in Batches von 500-5000 Zeilen pro Transaktion. Dies reduziert Disk-I/O und Lock-Overhead um das 10- bis 100-fache. Die meisten Datenbanken erzielen die grossten Gewinne bei Batch-Grossen von 1000. Grossere Werte bieten abnehmende Ertrage und erhohen die Kosten eines Rollbacks bei Fehlern.

Zeilenweise Fehlerbehandlung

Zuverlassigkeit

Parsen und validieren Sie jede JSONL-Zeile einzeln. Protokollieren Sie die Zeilennummer und Fehlermeldung fur jede Zeile, die die Validierung oder Einfugung nicht besteht. Verwenden Sie ON CONFLICT / ON DUPLICATE KEY, um Unique-Constraint-Verletzungen elegant zu behandeln, anstatt den gesamten Import abzubrechen. Speichern Sie fehlgeschlagene Zeilen in einer separaten Fehlerdatei zur spateren Uberprufung.

Fortschrittsverfolgung

Beobachtbarkeit

Protokollieren Sie bei Dateien mit Millionen von Zeilen den Fortschritt alle N Datensatze (z. B. alle 10.000). Verfolgen Sie die Gesamtanzahl gelesener Zeilen, erfolgreiche Einfugungen, ubersprungene Duplikate und Fehler. Berechnen und zeigen Sie die Importrate (Datensatze/Sekunde) an, um Leistungsengpasse zu identifizieren. Dieses Feedback ist fur die Uberwachung langlaufender Importe unerlasslich.

Dieses generische Muster kombiniert Batching, Fehlerbehandlung und Fortschrittsverfolgung. Passen Sie es an jede Datenbank an, indem Sie die Insert-Funktion austauschen.

Produktionsreifes Batch-Import-Muster
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

Bereiten Sie Ihre Daten mit kostenlosen JSONL-Tools vor

Bevor Sie JSONL in Ihre Datenbank importieren, validieren Sie das Dateiformat und konvertieren Sie zwischen Formaten. Unsere kostenlosen Online-Tools verarbeiten alles lokal in Ihrem Browser, sodass Ihre Daten Ihren Rechner nie verlassen.

JSONL-Dateien online bearbeiten

JSONL-Dateien bis zu 1 GB direkt in Ihrem Browser anzeigen, validieren und konvertieren. Kein Upload erforderlich, 100 % privat.

Haufig gestellte Fragen

JSONL Import/Export — PostgreSQL, MongoDB, BigQuery & meh...