更好的方法是将json转换为SQLAlchemy对象

Liq*_*Lau 4 python json sqlalchemy

这些天我正在学习SQLAlchemy.当我想从json加载一个对象并将其保存到MySQL时,事情变得困难,因为我的模型中的字段超过20,我想知道是否有更好的方法来做到这一点.

我的原始代码如下:

class User(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    name = Column(String)

json_str = """{"id": 1, "name": "yetship"}"""
obj = json.loads(json_str)
user = User(id=obj.get("id"), name=obj.get("name"))
Run Code Online (Sandbox Code Playgroud)

它可以工作,但随着我添加更多字段,它变得非常糟糕.

vis*_*ell 16

如果您的json文件中只有可以初始化Userfrom的字段.然后你就可以做到.

user = User(**obj)
Run Code Online (Sandbox Code Playgroud)

**obj将解压你的dict对象,所以如果有obj = {'id': 1, 'name': 'Awesome'},User(**obj)将会这样做User(id=1, name='Awesome')

你可以看到文档

注意:最好是避免使用id作为变量|领域,因为'id' in dir(__builtin__),这样id的bultins

UPD

如果您的json字段中不属于该模型,则可以使用dict理解过滤掉它们

user = User(**{k:v for k, v in obj.items() if k in {'id', 'name'}})
Run Code Online (Sandbox Code Playgroud)

UPD for UPD

这取决于你的大小obj,在大多数情况下,迭代可能更好(性能和清晰度)('id', 'name')而不是obj.items():

user = User(**{k: obj[k] for k in ('id', 'name') if k in obj})
Run Code Online (Sandbox Code Playgroud)

  • @deed02392我的意思是`id`是内置关键字,所以如果你重新声明它,你将无法使用函数`id()`。IDE 也会相应地突出显示它们。 (2认同)