SQL Alchemyで簡単に処理できるはずの小さな問題がありますが、正しく処理できないようです。2つのテーブルがあり、1つは親テーブルで、もう1つは子テーブルです。子レコードごとに一意のIDが必要ですが、一意の親レコードのコンテキストのみが必要です。
私は宣言型ベースのアプローチを使用しています。
FKとリレーション関数を使用して親子リレーションシップを設定します。私が達成しようとしているのは、Categoryの一意の名前グループ内の最大CategoryID値を検索し、それを1つ増やす疑似自動インクリメント関数のようなものを取得することです。さまざまなデフォルト関数を使用してみましたが、挿入時にCategoryUniqueNameを指定できないという問題が発生しました。func.max(CategoryItems.CategoryID)のようなものを選択しようとしたときに、ルックアップクエリに正しいフィルターが適用されるように、CategoryItems.CategoryUniqueNameの現在の値を渡す方法が見つかりません。クエリをハードコーディングすると、問題なく機能します。これは私がうまくいくと思っていることですが、繰り返しになりますが、フィルターの一意の値を指定する方法が見つかりません。
unique_group='my_group'
result=con.query(func.max(CategoryItems.CategoryID)).filter(and_(
CategoryItems.CategoryUniqueName==unique_group,
)).one()
クラスを以下に示します。標準のSQLAlchemy内でこれを実現する方法に関するガイダンスに感謝します。いつでも値を検索して、同じトランザクション内で直接指定できることはわかっていますが、他の場所に追加のロジックを必要としないスタンドアロンのSQLAlchemyアプローチを考え出そうとしています。
class Category(Base):
__tablename__ = 'parent_table'
__table_args__ = {'mysql_engine':'InnoDB', 'useexisting':True}
CategoryUniqueName = Column(Unicode(255), primary_key=True)
CategoryGroupName = Column(Unicode(255), nullable=False)
CategoryGroupMemo = Column(UnicodeText)
SortOrder = Column(Integer, index=True)
IsLocked = Column(Boolean, default=0)
class CategoryItems(Base):
__tablename__ = 'child_table'
__table_args__ = {'mysql_engine':'InnoDB', 'useexisting':True}
CategoryUniqueName = Column(Unicode(255), ForeignKey(Category.CategoryUniqueName), primary_key=True)
CategoryID = Column(Integer, primary_key=True, autoincrement=False)
CategoryName = Column(Unicode(255), nullable=False, index=True)
CategoryMemo = Column(UnicodeText)
CategoryImage = Column(Unicode(255))
CategoryFlex1 = Column(Unicode(255), index=True)
CategoryFlex2 = Column(Unicode(255), index=True)
CategoryFlex3 = Column(Unicode(255), index=True)
SortOrder = Column(Integer, index=True)
category_group = relation(
Category,
backref=backref(
'items',
order_by=SortOrder,
collection_class=ordering_list('SortOrder'),
cascade="all, delete, delete-orphan"
))