Python SQLAlchemy在__init__中更改__tablename__

时间:2018-10-08 17:09:01

标签: python mysql sqlalchemy

我有2个表具有相同的列结构。

该脚本从2个不同的json来源中提取,它们的键略有不同。

我的Item类标识源,然后解析数据。

在我的Item类中,我希望能够根据数据源更改 __ tablename __

这是可能的还是我需要为每个数据源编写一个单独的类?

谢谢

代码:

Base = declarative_base()


class Item(Base):
    __tablename__ = 'products'

    timestamp = Column(TIMESTAMP)
    itemid = Column(String, primary_key=True, index=True, unique=True)
    name = Column(String)    

    def __init__(self, item):

        if type(item) == Product_A:
            self.__tablename__ = "A_products"
            # Parse Data
        elif type(item) == Product_B:
            self.__tablename__ = "B_products"
            # Parse Data

1 个答案:

答案 0 :(得分:1)

这不是一个好主意,在sqlalchemy中,每个类都应映射到单个表。一种解决方案是使两个类和一个自由函数在它们之间分配:

Base = declarative_base()
class Item_A(Base):
    __tablename__ = 'A_products'
    timestamp = Column(TIMESTAMP)
    itemid = Column(String, primary_key=True, index=True, unique=True)
    name = Column(String)    

class Item_B(Base):
    __tablename__ = 'B_products'
    timestamp = Column(TIMESTAMP)
    itemid = Column(String, primary_key=True, index=True, unique=True)
    name = Column(String)    

def create_item_object(item):
    if isinstance(item, Product_A):
        result = Item_A()
        #... more stuff
    elif isinstance(item, Product_B):
        result = Item_B()
        #... more stuff
    return result