その逆Row変換及び副へSQLAlchemyの列 - それは可能ですか?
-
21-09-2019 - |
質問
私は、データベース、提出フィールドごとに1つの行のシリーズにフォームの送信から受信した辞書を変換するためのSQLAlchemyの唯一の解決策を探しています。これは、アプリケーション間で大きく異なるの好みや設定を処理することです。しかし、それは非常に可能性が適用機能のようなピボットテーブルを作成するのです。私は、ETLツールで事のこの種のを見てきましたが、私はORMで直接それを行うための方法を探していました。私はそれを上の任意のドキュメントを見つけることができませんでしたが、多分私は何かを逃しています。
例:
フォームから送信:{ "一意ID":1、 "":23、 "B": "こんにちは"、 "C": "世界"}
私はそれがこのようなデータベースに記録されるように、それは(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のアプローチを使用しています。
事前のおかげで...
乾杯、
ポール
解決
はここでドキュメントから若干変形例ですワークのモデル辞書にマッピングされ、このようなテーブル構造を有する:
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()
所属していません StackOverflow