gpt4 book ai didi

python - SQLAlchemy 列到行的转换,反之亦然——这可能吗?

转载 作者:太空狗 更新时间:2023-10-30 02:14:22 27 4
gpt4 key购买 nike

我正在寻找一种仅限 SQLAlchemy 的解决方案,用于将从表单提交中收到的字典转换为数据库中的一系列行,每个行对应提交的每个字段。这是为了处理在不同应用程序中差异很大的首选项和设置。但是,它很可能适用于创建类似功能的数据透视表。我在 ETL 工具中看到过这种类型的东西,但我正在寻找一种直接在 ORM 中完成它的方法。我找不到任何关于它的文档,但也许我遗漏了什么。

例子:

从表单提交:{"UniqueId":1, "a":23, "b":"Hello", "c":"World"

我希望它被转换(在 ORM 中)以便它像这样记录在数据库中:

_______________________________________
|UniqueId| ItemName | ItemValue |
---------------------------------------
| 1 | a | 23 |
---------------------------------------
| 1 | b | Hello |
---------------------------------------
| 1 | c | World |
---------------------------------------

选择后,结果将(在 ORM 中)转换回来自每个单独值的一行数据。

---------------------------------------------------
| UniqueId | a | b | c |

---------------------------------------------------
| 1 | 23 | Hello | World |

---------------------------------------------------

我假设更新时最好的做法是将删除/创建包装在事务中,以便删除当前记录并插入新记录。

ItemNames 的最终列表将在单独的表中维护。

完全接受更优雅的解决方案,但如果可能的话,希望远离数据库。

我在 SQLAlchemy 中使用 declarative_base 方法。

提前致谢...

干杯,

保罗

最佳答案

这是来自 documentation 的一个稍微修改过的例子使用映射到模型中字典的这种表结构:

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm.collections import attribute_mapped_collection
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import relation, sessionmaker

metadata = MetaData()
Base = declarative_base(metadata=metadata, name='Base')

class Item(Base):

__tablename__ = 'Item'
UniqueId = Column(Integer, ForeignKey('ItemSet.UniqueId'),
primary_key=True)
ItemSet = relation('ItemSet')
ItemName = Column(String(10), primary_key=True)
ItemValue = Column(Text) # Use PickleType?

def _create_item(ItemName, ItemValue):
return Item(ItemName=ItemName, ItemValue=ItemValue)

class ItemSet(Base):

__tablename__ = 'ItemSet'
UniqueId = Column(Integer, primary_key=True)
_items = relation(Item,
collection_class=attribute_mapped_collection('ItemName'))
items = association_proxy('_items', 'ItemValue', creator=_create_item)

engine = create_engine('sqlite://', echo=True)
metadata.create_all(engine)

session = sessionmaker(bind=engine)()
data = {"UniqueId": 1, "a": 23, "b": "Hello", "c": "World"}
s = ItemSet(UniqueId=data.pop("UniqueId"))
s.items = data
session.add(s)
session.commit()

关于python - SQLAlchemy 列到行的转换,反之亦然——这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2089661/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com