【问题标题】:Defining Indexes in SqlAlchemy with Alembic使用 Alembic 在 SqlAlchemy 中定义索引
【发布时间】:2014-01-17 17:02:46
【问题描述】:

我完全同意这是一个非常基本的问题,可能在某个地方有它的答案,但不知何故我找不到它。 (我对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. 为此定义一个单列索引(例如在电子邮件中)? (可能 index=True 会这样做。如果是这样,那么它主要是下一点 我迷路了)
  2. 如何在此定义多列索引(例如,在电子邮件和 ip_addr 上。我使用 alembic 进行迁移,当我定义类似 - Index('user_index',Users.c.email) [注释行] 在类中的列定义之后,它确实给了我一个错误“NameError: name 'Users' is not defined”)

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

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

我的应用名称是教程。如果以某种方式需要它,我将使用 Pyramid 作为框架。和 postgres 作为数据库。

我再说一遍,这可能是一个非常基本的问题,但我现在无法弄清楚,所以任何帮助都会很棒。

谢谢。

【问题讨论】:

    标签: python sqlalchemy alembic


    【解决方案1】:

    对我来说,是的,在您的字段定义中使用 index=True

    对于 II,只需将 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)
    

    【讨论】:

    • 感谢它确实有效,只是做了一点小改动。而不是 Index('user_index',Users.c.email, Users.c.ip_addr) 我使用了 Index('user_index',Users.email, Users.ip_addr) 它就像一个魅力!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-12-16
    • 2014-01-06
    • 2018-06-29
    • 2017-01-08
    • 2021-08-04
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多