你的例子似乎完全适合于关系数据库。您在用户和事务之间有一对一的关系,SQLAlchemy ORM可以很好地表达这一点。
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
transaction_id = Column(Integer, ForeignKey('transaction.id'))
transaction = relationship(
"Transaction", uselist=False, backref=backref("user", uselist=False))
class Transaction(Base):
__tablename__ = 'transaction'
id = Column(Integer, primary_key=True)
amount = Column(Integer)
date = Column(DateTime, default=datetime.datetime.now)
接口:
>>> t = Transaction(amount=100)
>>> u = User()
>>> u.transaction = t
>>> session.add(u)
>>> session.commit()
>>> u = session.query(User).first()
>>> u.transaction.amount
100
>>> u.transaction.date
datetime.datetime(2016, 1, 24, 16, 21, 38, 683959)
我不知道为什么你想有交易表现为任意Python对象,但是如果它有可变的列你可以编码交易对象为JSON 。 SQLAlchemy的方法有:fully expressing and automating this:
class JSONEncodedDict(TypeDecorator):
"Represents an immutable structure as a json-encoded string."
impl = VARCHAR
def process_bind_param(self, value, dialect):
if value is not None:
value = json.dumps(value)
return value
def process_result_value(self, value, dialect):
if value is not None:
value = json.loads(value)
return value
感谢您的详细回复!我是SQLAlchemy的新手,我仍然在寻找解决方法。但这正是我想要实现它的方式。 – nihil0