Omi*_*nus 23 postgresql sqlalchemy turbogears
在表的SQLAlchemy类中是否有一种方法可以为该表定义/创建触发器和索引?
例如,如果我有一个基本的表...
class Customer(DeclarativeBase):
__tablename__ = 'customers'
customer_id = Column(Integer, primary_key=True,autoincrement=True)
customer_code = Column(Unicode(15),unique=True)
customer_name = Column(Unicode(100))
search_vector = Column(tsvector) ## *Not sure how do this yet either in sqlalchemy*.
Run Code Online (Sandbox Code Playgroud)
我现在想要创建一个触发器来更新"search_vector"
CREATE TRIGGER customers_search_vector_update BEFORE INSERT OR UPDATE
ON customers
FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(search_vector,'pg_catalog.english',customer_code,customer_name);
Run Code Online (Sandbox Code Playgroud)
然后我想将该字段添加为索引...
create index customers_search_vector_indx ON customers USING gin(search_vector);
Run Code Online (Sandbox Code Playgroud)
现在我从我的应用程序执行任何类型的数据库重新生成后,我必须为tsvector列添加列,触发器定义,然后是psql的索引语句.不是世界末日,而是容易忘记一步.我全都是关于自动化的,所以如果我能在应用程序设置期间完成这一切,那么奖金!
van*_*van 38
指令很容易创造.对于具有index=True以下参数的单列:
customer_code = Column(Unicode(15),unique=True,index=True)
Run Code Online (Sandbox Code Playgroud)
但是如果您想要更多地控制名称和选项,请使用显式的Index()构造:
Index('customers_search_vector_indx', Customer.__table__.c.search_vector, postgresql_using='gin')
Run Code Online (Sandbox Code Playgroud)
也可以创建触发器,但这些触发器仍然需要SQL基于DDL事件并挂钩.有关详细信息,请参阅自定义DDL,但代码可能类似于以下内容:
from sqlalchemy import event, DDL
trig_ddl = DDL("""
CREATE TRIGGER customers_search_vector_update BEFORE INSERT OR UPDATE
ON customers
FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(search_vector,'pg_catalog.english',customer_code,customer_name);
""")
tbl = Customer.__table__
event.listen(tbl, 'after_create', trig_ddl.execute_if(dialect='postgresql'))
Run Code Online (Sandbox Code Playgroud)
旁注:我不知道如何配置tsvector数据类型:值得单独提问.
| 归档时间: |
|
| 查看次数: |
7869 次 |
| 最近记录: |