3

列のデフォルトおよびonupdate仕様からトリガーされるコンテキスト依存関数(たとえば、def get_user_full_name())を追加する方法を整理しようとしています。すべてのクエリで2つのフィールドを常に連結する必要がないように、名前と名前を1つのフルネーム値に結合する複合フィールドを設定しようとしています。

私は宣言型アプローチを使用しています。これは、同様のモデルの例です。

class SomeMembers(Base):
    __tablename__ = 'some_members'
    __table_args__ = {'mysql_engine':'InnoDB'}

    SomeGroup = Column(Unicode(50), primary_key=True)
    UserID = Column(Unicode(50), primary_key=True)
    FullName = Column(Unicode(255), default=get_user_full_name, onupdate=get_user_full_name, index=True)
    FirstName = Column(Unicode(255), index=True)
    LastName = Column(Unicode(255), index=True)
    UserName = Column(Unicode(255))

これは、FirstNameキーとLastNameキーのどちらも有効ではないことをスタックトレースで報告する、私が作成した関数です。

def get_user_full_name(context):
    return " ".join((context.compiled_parameters[0]['FirstName'],context.compiled_parameters[0]['LastName']))

2つの列(FirstNameとLastName)の既存のデータを参照して、簡単に取得できるように格納する複合値を作成する方法がわかりません。たとえば、John Doeという名前のユーザーがいる場合、get_user_full_nameメソッドは「John」と「Doe」を取り、「JohnDoe」のフルネーム値を返す必要があります。

ドキュメントでは、context.current_parametersを参照していますが、私の場合は存在しません。宣言型のアプローチを使用しているためだと思います。それが機能した場合、私のget_user_full_name関数は次のようになります。

def get_user_full_name(context):
    return " ".join((context.current_parameters['FirstName'],context.current_parameters['LastName']))

これはおそらく些細なことですが、この情報が保存されている場所と動的にアクセスする方法についてコードを解読することはできないようです。

少し洞察をいただければ幸いです。私もよりエレガントなアプローチを受け入れています。

前もって感謝します...

乾杯、

ポール

4

2 に答える 2

1

誰かが答えを探している場合に備えて。

マッパーイベントを使用できます

@event.listens_for(SomeMembers, 'before_insert')
def before_insert_function(mapper, connection, target):
        target.FullName = f"{target.FirstName} {target.LastName}"
于 2019-11-20T17:17:04.597 に答える
0

次の式を試しました。

from sqlalchemy.sql.expression import column, literal, literal_column

Column('full_name', String, onupdate=literal_column("first_name") + literal(" ") + literal_column("last_name"))

これは一種の動作ですが、full_nameとの以前の値でをfirst_name更新しますlast_name。を使用しcolumnても同じ結果が得られます。

複合カラムはその役割を果たしますか?

于 2011-03-02T10:01:16.060 に答える