简体   繁体   中英

Database tables generation using sqlalchemy

I'm currently trying to generate SQL tables using the sqlalchemy library.

I have two tables : t_volume and t_volume_snapshot

class Volume(...):
    """ Represent a volume element"""

    __tablename__ = "t_volume"

    created_at = Column(DateTime, nullable=False)
    deleted_at = Column(DateTime, nullable=False)
    volume_id = Column(String(length=255), nullable=False, primary_key=True)
    volume_name = Column(String(length=255), nullable=False)
    volume_type = Column(String(length=255), nullable=False)
    volume_disk_space = Column(Integer, nullable=False)

class VolumeSnapshot(...):
    """ Represent a volume snapshot element"""

    __tablename__ = "t_volume_snapshot"

    created_at = Column(DateTime, nullable=False)
    deleted_at = Column(DateTime, nullable=False)
    volume_snapshot_id = Column(String(length=255), nullable=False, primary_key=True)
    volume_snapshot_name = Column(String(length=255), nullable=False)
    volume_id = Column(String(length=255), ForeignKey("t_volume.volume_id"))

I would like that a volume snapshot refers to a volume using the value volume_id . I tried to define the t_volume_snapshot . volume_id column as a ForeignKey pointing to t_volume . volume_id but all I get is

OperationalError: (OperationalError) (1005, "Can't create table 'db.t_volume_snapshot' (errno: 150)")

I'm not used to sqlalchemy and SQL in general so I'm probably missing something...

You should be able to do something like below

class Volume(...):
    """ Represent a volume element"""

    __tablename__ = "t_volume"

    created_at = Column(DateTime, nullable=False)
    deleted_at = Column(DateTime, nullable=False)
    volume_id = Column(String(length=255), nullable=False, primary_key=True)
    volume_name = Column(String(length=255), nullable=False)
    volume_type = Column(String(length=255), nullable=False)
    volume_disk_space = Column(Integer, nullable=False)

    snapshots = relationship("VolumeSnapshot", back_populates="t_volume")

class VolumeSnapshot(...):
    """ Represent a volume snapshot element"""

    __tablename__ = "t_volume_snapshot"

    created_at = Column(DateTime, nullable=False)
    deleted_at = Column(DateTime, nullable=False)
    volume_snapshot_id = Column(String(length=255), nullable=False, primary_key=True)
    volume_snapshot_name = Column(String(length=255), nullable=False)
    snapshot_volume_id = Column(String(length=255), ForeignKey("volume_id"))

This should establish a bidirectional connection.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM