Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我将使用什么样的数据库模式来存储用户的事务历史记录?_Python_Sqlite_Sqlalchemy - Fatal编程技术网

Python 我将使用什么样的数据库模式来存储用户的事务历史记录?

Python 我将使用什么样的数据库模式来存储用户的事务历史记录?,python,sqlite,sqlalchemy,Python,Sqlite,Sqlalchemy,我有一系列python对象,每个对象都与不同的用户关联,例如obj1.userID=1、obj2.userID=2等。每个对象还具有一个用python dict表示的事务历史记录,即obj2.transaction_record={itemID:1、amount:1、date:2011-01-04}等 我需要这些对象来持久化,事务记录可能会随着时间的推移而增长。因此,我正在考虑使用类似sqlalchemy的ORM来实现这一点 要在数据库中存储这些对象,我需要指定哪种数据库模式 我有两种选择,但这

我有一系列python对象,每个对象都与不同的用户关联,例如obj1.userID=1、obj2.userID=2等。每个对象还具有一个用python dict表示的事务历史记录,即obj2.transaction_record={itemID:1、amount:1、date:2011-01-04}等

我需要这些对象来持久化,事务记录可能会随着时间的推移而增长。因此,我正在考虑使用类似sqlalchemy的ORM来实现这一点

要在数据库中存储这些对象,我需要指定哪种数据库模式

我有两种选择,但这两种选择似乎都不正确:

为每个用户提供不同的表: 创建表用户\u id itemID INT主键、金额INT、日期字符10;

将事务历史记录dict存储为json的BLOB: 创建表foo userID INT主键,trasaction_history BLOB


有没有更干净的方法来实现这一点?

如果您直到现在才决定使用哪种数据库,我建议您选择mongodb作为数据库服务器,选择mongoengine模块作为持久化数据,这正是您所需要的,mongoengine有一个dict字段,您可以直接在其中存储python dict,而且非常容易学习。

不要将事务历史视为一个大的、可变的东西,而是将其视为一组不可变的记录。将每条记录作为一行存储在专用事务表中,例如

创建表用户 id整数主键 ; 创建表事务 id整数主键, user\u id整数引用usersid, 金额整数, 戳时间戳 ; -必要时重复上述步骤 在交易记录中插入用户id、金额、戳记 值1,3,'2016-01-24 00:00:00'; 现在,您可以插入单独的记录,并通过以下内容查看用户的整个交易历史

选择id、金额、戳记 来自交易 其中,用户\u id= 邮戳订购ASC;
您的示例似乎完全适合于关系数据库。用户和事务之间有一对一的关系,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有以下几种方法:


是什么让您认为您可以根据问题中的少量信息提出明智的DBMS建议?对于OP来说,MongoDB可能是一个糟糕的选择,有很多原因。这个问题中的所有内容都可以在关系数据库中合理处理,OP似乎是基于标记使用关系数据库的。谢谢!这是一个更好的实现方法。感谢您的详细回复!我对炼金术还不熟悉,但我仍在寻找解决方法。但这正是我想要实现它的方式。
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