const move = (from, to, ...a) =>from === to ? a : (a.splice(to, 0, ...a.splice(from, 1)), a);
const moved = move(0, 2, ...['a', 'b', 'c']);
console.log(moved)
Если вам нужно отобразить отношение 1-N и отобразить его как dict
, а не list
, затем прочтите Коллекции на основе словаря
Но если вы имеете в виду поле , то что вы можете сделать, чтобы иметь поле БД типа string, которое отображается на ваш объект Python. Но для того же объекта python вы предоставляете свойство, которое будет своего рода прокси для этого сопоставленного строкового поля типа dict (). Пример кода (не тестировался):
class MyObject(object):
# fields (mapped automatically by sqlalchemy using mapper(...)
MyFieldAsString = None
def _get_MyFieldAsDict(self):
if self.MyFieldAsString:
return eval(self.MyFieldAsString)
else:
return {} # be careful with None and empty dict
def _set_MyFieldAsDict(self, value):
if value:
self.MyFieldAsString = str(value)
else:
self.MyFieldAsString = None
MyFieldAsDict = property(_get_MyFieldAsDict, _set_MyFieldAsDict)
SQLAlchemy PickleType предназначен именно для этого.
class SomeEntity(Base):
__tablename__ = 'some_entity'
id = Column(Integer, primary_key=True)
attributes = Column(PickleType)
# Just set the attribute to save it
s = SomeEntity(attributes={'baked': 'beans', 'spam': 'ham'})
session.add(s)
session.commit()
# If mutable=True on PickleType (the default) SQLAlchemy automatically
# notices modifications.
s.attributes['parrot'] = 'dead'
session.commit()
Вы можете изменить механизм сериализации, заменив средство выбора другим, имеющим dumps ()
и загружает ()
методы. Базовый механизм хранения путем создания подкласса PickleType и переопределения атрибута impl:
class TextPickleType(PickleType):
impl = Text
import json
class SomeOtherEntity(Base):
__tablename__ = 'some_other_entity'
id = Column(Integer, primary_key=True)
attributes = Column(TextPickleType(pickler=json))