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.
-- 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;
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.
-- 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",...}
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.
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: 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.
# 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 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.
# 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 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.
-- 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;
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.
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: 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.
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;
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
LeistungFugen 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
ZuverlassigkeitParsen 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
BeobachtbarkeitProtokollieren 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.
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
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.