使用Alembic在SqlAlchemy中定义索引

10

我完全同意这是一个相当基础的问题,也许它的答案已经存在某个地方了,但我无论如何都找不到它。(而且我对SqlAlchemy不是很精通)

我有这段代码 -

from sqlalchemy import Column, Integer, Text, String, TIMESTAMP, Boolean, \
    UnicodeText
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.schema import Sequence, ForeignKey, Index
from zope.sqlalchemy import ZopeTransactionExtension
import datetime

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base()

class Users(Base):
    __tablename__ = "user_table"

    id = Column(Integer, Sequence('idseq'), primary_key = True)
    email = Column(String, unique=True)
    ip_addr = Column(String)
    created_date = Column(TIMESTAMP(timezone=True), default=datetime.datetime.utcnow)
    modified_date = Column(TIMESTAMP(timezone=True), default=datetime.datetime.utcnow)
    #Index('user_index',Users.c.email)

我该如何

  1. 在这个表中定义一个单列索引(比如在email上)?(可能使用index=True就可以了。如果是这样的话,那么大多数情况下,下一步就是让我困惑的地方)
  2. 如何在这个表上定义一个多列索引(比如在email和ip_addr上),例如在alembic迁移中,当我在类的列定义之后定义类似于“Index('user_index', Users.c.email)”这样的语句时,它会给出一个错误:“NameError: name'Users'未定义” )

除了所有正常和默认的行之外,在alembic的env.py中,我还有这两行

from tutorial.models import Base
.
.
.
target_metadata = Base.metadata

我的应用程序名称为"tutorial"。如果需要的话,我使用Pyramid框架和Postgres数据库。

我再次强调,这可能是一个非常基础的问题,但我现在想不出来了,所以任何帮助都将是极好的。

谢谢。

1个回答

12

对于第一条建议,可以在字段定义中使用index=True

对于第二条建议,只需将Index声明放在类定义之外即可:

class Users(Base):
    __tablename__ = "user_table"

    id = Column(Integer, Sequence('idseq'), primary_key=True)
    email = Column(String, unique=True)
    ip_addr = Column(String)
    created_date = Column(TIMESTAMP(timezone=True), default=datetime.datetime.utcnow)
    modified_date = Column(TIMESTAMP(timezone=True), default=datetime.datetime.utcnow)

Index('user_index', Users.c.email, Users.c.ip_addr)

2
谢谢,它确实起作用了,只是做了一个小改变。我使用的是Index('user_index',Users.email, Users.ip_addr)而不是Index('user_index',Users.c.email, Users.c.ip_addr),它表现得非常好!!感谢。 - SRC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接