【发布时间】:2013-02-04 23:14:25
【问题描述】:
我希望能够在我的一个 SQLAlchemy 映射对象的多个文本字段中进行全文搜索。我还希望我的映射对象支持外键和事务。
我打算使用 MySQL 来运行全文搜索。但是,我知道 MySQL 只能在不支持事务和外键的 MyISAM 表上运行全文搜索。
为了实现我的目标,我计划创建两个表。我的代码将如下所示:
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
这似乎可行,但我有几个问题:
我创建两个表来解决我的问题的方法是否合理?有没有标准/更好/更清洁的方法来做到这一点?
有没有一种 SQLAlchemy 方法来创建全文索引,还是我最好像上面那样直接执行“CREATE FULLTEXT INDEX ...”?
看起来我在搜索/匹配查询时遇到了 SQL 注入问题。如何选择“SQLAlchemy 方式”来解决这个问题?
有没有一种干净的方法可以将 users_myisam 选择/匹配项加入到我的用户表中并返回实际的用户实例,因为这是我真正想要的?
为了使我的 users_myisam 表与我的映射对象用户表保持同步,我是否可以在我的 User 类上使用 MapperExtension,并设置 before_insert、before_update 和 before_delete 方法来更新users_myisam 表是否合适,或者有更好的方法来完成这个?
谢谢, 迈克尔
【问题讨论】:
-
我知道这可能是不可能的,但是如果你正在启动一个新的应用程序,Postgresql 也有全文索引,没有 MySQL 的愚蠢限制。
标签: python mysql full-text-search sqlalchemy