【问题标题】:Better way convert json to SQLAlchemy object更好的方法将 json 转换为 SQLAlchemy 对象
【发布时间】:2017-02-14 22:14:42
【问题描述】:

这些天我正在学习 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"))

它可以工作,但是当我添加更多字段时,它变得很糟糕。

【问题讨论】:

  • 为什么不用原生支持json文档的数据库呢?
  • 这只是一个转储和加载功能,不需要这个并使用nosql dbs ...

标签: python json sqlalchemy


【解决方案1】:

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

user = User(**obj)

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

你可以看到the docs

注意:最好避免使用id作为变量|字段,因为'id' in dir(__builtin__),所以id在bultins中

UPD

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

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

UPD 为 UPD

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

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

【讨论】:

  • 您能解释一下避免使用id 的意思吗?目前的写法没有意义。
  • @deed02392 我的意思是id 是内置关键字,所以如果你重新声明它,你将无法使用函数id()。 IDE 也会相应地突出显示它们。
猜你喜欢
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多