代码之家  ›  专栏  ›  技术社区  ›  joeforker

如何指示SQLAlchemy在create_all()上创建SQLite FTS3表?

  •  7
  • joeforker  · 技术社区  · 14 年前

    .create_all() . 我需要添加哪些特殊选项以便它知道 CREATE VIRTUAL TABLE ... USING FTS3(tokenizer=...) ?

    1 回复  |  直到 14 年前
        1
  •  3
  •   estin    12 年前

    据我所知,要实现这个未来,您必须改进sqlite方言以更改create\ U table行为。

    但你可以用这个快速,但丑陋的解决方案与“monkeypatching”

    # ugly monkeypatch
    from sqlalchemy.dialects.sqlite.base import SQLiteDDLCompiler
    
    old_create_table = SQLiteDDLCompiler.visit_create_table
    
    def new_create_table(*args, **kwargs):
        sql = old_create_table(*args, **kwargs)
        # TODO 
        # 1) check table with FTS3 
        # 2) change sql to CREATE VIRTUAL TABLE ... USING FTS3(tokenizer=...)
        print 'SQL: %s' % sql
        return sql
    
    SQLiteDDLCompiler.visit_create_table = new_create_table
    # end of ugly monkey patch
    
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import schema, MetaData, Column, Integer
    
    metadata = MetaData()
    Base = declarative_base(metadata=metadata) 
    
    class MyModel(Base):
        __tablename__ = 'table'
        id = Column(Integer, primary_key=True)
    
    if __name__ == '__main__':
        from sqlalchemy import create_engine
        engine = create_engine('sqlite:///', echo=True)
        metadata.bind = engine
        metadata.create_all() 
    
    推荐文章