私はSQLAlchemyのORMを初めて使用しました。私は、データベーステーブルを持っているLabel
、Position
、およびDataSet
次のように:SQLAlchemyで2つのモデルクラスを結合する方法
そして、次の対応するPythonのクラス:
class Label(Base):
__tablename__ = 'Label'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False, unique=true)
class Position(Base):
__tablename__ = 'Position'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False, unique=true)
class DataSet(Base):
__tablename__ = 'DataSet'
id = Column(Integer, primary_key=True)
label_id = Column(Integer, ForeignKey('Label.id'))
position_id = Column(Integer, ForeignKey('Position.id'))
timestamp = Column(Integer, nullable=False)
しかし、私のservieで、私はそれらのlabel_id
を公開していないとし、 position_id
。だから私は新しいクラスData
を文字列としてlabel
とposition
を保持するようにしました。
# Not a full class to only show my concept
class Data:
# data dictionary will have data
def __init__(self, **kwargs):
# So it doesn't have ids. Label and Position as string
keys = {'label', 'position', 'timestamp'}
self.data = {k: kwargs[k] for k in keys}
# An example of inserting data.
# skipped detail and error handling to clarify
def insert(self):
session = Session()
# get id of label and position
# remember that it returns a tuple, not a single value
self.data['label_id'] = session.query(Label.id).\
filter(Label.name == self.data['label']).one_or_none()
self.data['position_id'] = session.query(Position.id).\
filter(Position.name == self.data['position']).one_or_none()
# add new dataset
self.data.pop('label')
self.data.pop('position')
new_data = DataSet(**self.data)
session.add(new_data)
session.commit()
しかし、それはやや醜いように見えますが、私はそれを行う簡単な方法があると思います。 SQLAlchemy APIを使用してこれらのテーブルクラスを組み合わせる方法はありますか?
私は関係について読んだことがありますが、関連プロキシについてはわかりませんでした。これは私の時間を節約します。どうもありがとうございました! –