使用SQLAlchemy正确使用MySQL全文搜索

2024-09-28 22:54:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望能够在我的一个SQLAlchemy映射对象的多个文本字段中进行全文搜索。我还希望我的映射对象支持外键和事务。

我计划使用MySQL来运行全文搜索。但是,我知道MySQL只能在MyISAM表上运行全文搜索,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

这似乎有效,但我有几个问题:

  1. 我创建两个表来解决问题的方法合理吗?有没有一种标准的/更好的/更干净的方法来做到这一点?

  2. 有没有一种SQLAlchemy方法来创建全文索引,或者我最好直接执行“create fulltext index…”就像我上面做的那样?

  3. 看起来我在搜索/匹配查询时遇到了SQL注入问题。如何选择“SQLAlchemy方式”来修复此问题?

  4. 有没有一种干净的方法可以将users_myisam select/match against右键返回到我的用户表并返回实际的用户实例,因为这是我真正想要的?

  5. 为了使我的users_myisam表与映射对象用户表保持同步,在我的用户类上使用MapperExtension并设置before_insert、before_update和before_delete方法来适当地更新users_myisam表是否有更好的方法来实现这一点?

谢谢, 迈克尔


Tags: 对象方法用户namebasesqlalchemycolumndescription