使用SQLAlchemy读取整个数据库并将其转换为JSON格式

3
Django有一个方便的manage.py命令dumpdata可以配置为将整个数据库转储为JSON
目前我只能使用sqlalchemy,我想做同样的事情:
'mysql+pymysql://user:pwd@localhost:3306/'这样的连接字符串作为输入,并获取数据库内容为JSON(我不需要Django提供的所有元信息,但我不介意)。
找到了这个问题,详细说明了如何将SQLAlchemy对象转储为JSON,这是SQLAlchemy文档中的内容,概述了如何从数据库获取所有表名:
meta = MetaData()
input_db = f'sqlite:///tmpsqlite'
engine = create_engine(input_db)
meta.reflect(bind=engine)
print(meta.tables)

我该如何检索这些表的所有内容,然后将它们转换为JSON?是否有sqlalchemy中类似于django's dumpdata功能的内置命令?
1个回答

6

为了保留记录,我在此留下我的解决方案:

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
请注意,zip(...) 是多余的。RowProxy 本身就是一个映射,您可以直接将其传递给 dict() 构造函数:dict(row) - Ilja Everilä
如果你将dict()传递给一个行代理对象,你会得到什么。 - Ilja Everilä
2
sqlalchemy所需的导入是from sqlalchemy import create_engine; from sqlalchemy.schema import MetaData - pigishpig
这会为一个表生成一个JSON文件吗?如果内存限制较低或每个表的数据量很大,这不会出现问题吗? - Gabor
@Gabor 这是一个包含所有表格作为键和内容作为值的json(字典和json.dumps(...)之后)。确实,如果表格太大,可能会耗尽内存。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接