SQLAlchemy Column to Row Transformation and vice versa — is it possible?

前端 未结 1 834
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-18 08:38

I\'m looking for a SQLAlchemy only solution for converting a dict received from a form submission into a series of rows in the database, one for each field submitted. This

1条回答
  •  [愿得一人]
    2020-12-18 08:45

    Here is a slightly modified example from documentation to work with such table structure mapped to dictionary in model:

    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()
    

    0 讨论(0)
提交回复
热议问题