假设我有这样的桌子
class Base(object):
id = Column(Integer, primary_key=True)
date_updated = Column(Date, nullable=True)
rating = Column(Integer, nullable=False, default=0)
status = Column(SmallInteger, nullable=False, default=0)
@declared_attr
def __tablename__(cls):
return "table_%s" % cls.LANG
@declared_attr
def __table_args__(cls):
return (
Index('ix__%s__rating' % cls.__tablename__, 'rating'),
Index(
'ix__%s__status' % cls.__tablename__,
'status',
postgresql_where=column('status') == 0,
),
Index(
'ix__%s__date_updated' % cls.__tablename__,
'date_updated',
postgresql_where=column('date_updated') != None,
),
)
class TableEn(Base, db.Model):
LANG = 'en'
class TableUk(Base, db.Model):
LANG = 'uk'
我发现了如何在父级__table_args__
中创建status
和{
但是我需要创建desc排序索引rating
,比如func.desc(rating)
,但我不知道如何做到这一点。在
没有一个变体适合我(变体和它的错误):
Index('ix__%s__rating' % cls.__tablename__, 'rating desc')
键错误:“评级说明”
Index('ix__%s__rating' % cls.__tablename__, cls.rating.desc())
sqlalchemy.exc.ArgumentError:无法将未命名列添加到列集合中
Index('ix__%s__rating' % cls.__tablename__, desc('rating'))
在数据库中创建架构时
sqlalchemy.exc.ProgrammingError:(ProgrammingError)语法错误位于或接近“)” 第1行:在table\u en()上创建索引ix_Uutable_en_urating
当然,我可以用directsql手动创建索引,但我确信在某个地方存在解决方案。在
提前谢谢!在
以下是简化的代码:
完整代码here。在
你有两个问题。首先,应该对表列调用
desc
,而不是映射器对象属性。但如果您这样做了,那么填充就有问题,因为__table__
属性是在从__table__args__
获取信息后创建的。所以您需要在创建__table__
字段之后创建索引。一种方法是通过sqlalchemy事件。在相关问题 更多 >
编程相关推荐