SQLAlchemyでマップされたオブジェクトの1つの複数のテキストフィールドを全文検索できるようにしたいと思います。また、マップされたオブジェクトが外部キーとトランザクションをサポートするようにしたいと思います。
MySQLを使用して全文検索を実行する予定です。ただし、MySQLはMyISAMテーブルでのみ全文検索を実行できることを理解しています。これは、トランザクションと外部キーをサポートしていません。
私の目的を達成するために、2つのテーブルを作成する予定です。私のコードは次のようになります。
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
description = Column(Text)
users_myisam = Table('users_myisam', Base.metadata,
Column('id', Integer),
Column('name', String(50)),
Column('description', Text),
mysql_engine='MyISAM')
conn = Base.metadata.bind.connect()
conn.execute("CREATE FULLTEXT INDEX idx_users_ftxt \
on users_myisam (name, description)")
次に、検索するためにこれを実行します:
q = 'monkey'
ft_search = users_myisam.select("MATCH (name,description) AGAINST ('%s')" % q)
result = ft_search.execute()
for row in result: print row
これはうまくいくようですが、いくつか質問があります。
問題を解決するために2つのテーブルを作成するという私のアプローチは合理的ですか?これを行うための標準/より良い/よりクリーンな方法はありますか?
フルテキストインデックスを作成するSQLAlchemyの方法はありますか、それとも上記のように「CREATE FULLTEXTINDEX ...」を直接実行するのが最善ですか?
検索/クエリとの照合でSQLインジェクションの問題が発生しているようです。これを修正するには、「SQLAlchemyの方法」を選択するにはどうすればよいですか?
users_myisam select / matchをユーザーテーブルに直接結合して実際のユーザーインスタンスを返すクリーンな方法はありますか?これが私が本当に望んでいることなのでしょうか?
users_myisamテーブルをマップされたオブジェクトのuserテーブルと同期させるために、UserクラスでMapperExtensionを使用し、before_insert、before_update、およびbefore_deleteメソッドを設定してusers_myisamテーブルを適切に更新するのは理にかなっていますか。これを達成するためのより良い方法はありますか?
ありがとう、マイケル