2017-11-15 2 views
-1

Django hat den Komfort manage.py Befehl dumpdatawhich can be configured to dump an entire database as JSON.Lesen Sie die gesamte Datenbank mit sqlalchemy und Dump als JSON

Derzeit bin ich auf sqlalchemy mit eingeschlossen, und ich möchte die gleiche Sache tun:

Nehmen Sie als Eingabe eine Verbindungszeichenfolge wie 'mysql+pymysql://user:[email protected]:3306/' und den Inhalt der Datenbank erhalten, wie JSON (I benötige nicht alle Meta-Informationen, die Django zur Verfügung stellt, aber das macht mir nichts aus).

ich found this question erarbeiten, wie SQLAlchemy Objekte zu JSON-Dump und this from the sqlalchemy documentation darlegt, wie alle Tabellennamen aus einer Datenbank zu erhalten:

meta = MetaData() 
input_db = f'sqlite:///tmpsqlite' 
engine = create_engine(input_db) 
meta.reflect(bind=engine) 
print(meta.tables) 

Wie rufe ich alle Inhalte dieser Tabellen und sie dann zu JSON konvertieren ? Gibt es einen integrierten Befehl in sqlalchemy ähnlich wie django dumpdata Funktionalität?

Antwort

0

verlassen meine Lösung hier für die Nachwelt:

import json 

def dump_sqlalchemy(output_connection_string,output_schema): 
    """ Returns the entire content of a database as lists of dicts""" 
    engine = create_engine(f'{output_connection_string}{output_schema}') 
    meta = MetaData() 
    meta.reflect(bind=engine) # http://docs.sqlalchemy.org/en/rel_0_9/core/reflection.html 
    result = {} 
    for table in meta.sorted_tables: 
     result[table.name] = [dict(row) for row in engine.execute(table.select())] 
    return json.dumps(result) 
+1

Beachten Sie, dass die 'zip (...)' redundant ist. A [ 'RowProxy'] (http://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.RowProxy) ist eine Abbildung in seinem eigenen Recht, und Sie können es einfach passieren zu' dict () 'Konstruktor:' dict (row) '. –

+0

Was Sie erhalten, wenn Sie 'dict()' ein Zeilen-Proxy-Objekt übergeben. –

Verwandte Themen