SQLAlchemy连接表

时间:2015-06-27 23:31:18

标签: python sqlalchemy

我试图在每次用户执行某些操作时存储历史信息。由于历史信息对于多个表是相同的(例如,商店 - 从文件x导入的数据),我想将历史数据保存在单独的表中,并将相关历史项的id存储在其他表中。我遇到的问题是,并非每个表都会在每次更改历史记录时添加其历史记录列表 - 因此在历史记录中为每个表(数十个表)存储ForeignKey看起来不是正确的方法。

from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy import DateTime, Column, Integer, String
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from sqlalchemy.sql.schema import ForeignKey

class TableA(Base):
    __tablename__ = 'tablea'

    id = Column(Integer, primary_key=True, nullable = False)
    data = Column(String(), nullable=True)
    history = relationship("History")

class TableB(Base):
    __tablename__ = 'tableb'

    id = Column(Integer, primary_key=True, nullable = False)
    data = Column(String(), nullable=True)
    history = relationship("History")

class TableC(Base):
    __tablename__ = 'tablec'

    id = Column(Integer, primary_key=True, nullable = False)
    data = Column(String(), nullable=True)
    history = relationship("History")

class History(Base):
    __tablename__ = 'history'

    id = Column(Integer, primary_key=True, nullable = False)
    details = Column(String(), nullable=True)
    version = Column(String(), nullable=True)
    tablea_id = Column(Integer, ForeignKey('tablea.id'))
    tableb_id = Column(Integer, ForeignKey('tableb.id'))
    tablec_id = Column(Integer, ForeignKey('tablec.id'))

class Base(object):

    @declared_attr
    def __tablename__(cls):
        return str(cls.__name__)
    create_date = Column(DateTime, default=func.now()) 

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base(cls=Base)

我能弄清楚如何做到这一点的唯一方法是将TableA,B,C中的历史ID列表存储为字符串。然后使用JSON将字符串解码为python列表。但这种方法很乏味且容易出错。有什么想法吗?

0 个答案:

没有答案