【问题标题】:How to create non-unique index on column in sqlalchemy?如何在 sqlalchemy 中的列上创建非唯一索引?
【发布时间】:2014-01-03 21:57:14
【问题描述】:

我正在尝试在 file_name 列上创建一个非唯一索引。我期待一个高基数,比如 1,000 行,有 950 个唯一文件名。

file_collection = Table ('file_collection', metadata,
    Column('id', Integer, primary_key=True),
    Column('full_path', String, unique=True, nullable=False),
    Column('file_name', String, index=True, nullable=False)
)

我的方言是 sqlite。当我创建表时,file_name 列上没有创建非唯一键

CREATE TABLE file_collection (
        id INTEGER NOT NULL,
        full_path VARCHAR NOT NULL,
        file_name VARCHAR NOT NULL,
        PRIMARY KEY (id),
        UNIQUE (full_path)
)

如何在file_name 列上创建非唯一键?

【问题讨论】:

  • 您如何获得问题中显示的CREATE TABLE 代码?
  • 这个函数的第二个参数engine = create_engine('sqlite:///test.db', echo=True)

标签: sqlite sqlalchemy


【解决方案1】:

请记住,SQLite 要求您将非唯一索引创建为单独的语句,而不是像某些 RDBM 允许的那样在实际的 CREATE TABLE 语句中创建。假设我有下表:

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), index=True)

创建过程如下。

2014-01-03 17:28:48,229 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("users")
2014-01-03 17:28:48,229 INFO sqlalchemy.engine.base.Engine ()
2014-01-03 17:28:48,229 INFO sqlalchemy.engine.base.Engine
CREATE TABLE users (
        id INTEGER NOT NULL,
        email VARCHAR(255),
        PRIMARY KEY (id)
)


2014-01-03 17:28:48,230 INFO sqlalchemy.engine.base.Engine ()
2014-01-03 17:28:48,230 INFO sqlalchemy.engine.base.Engine COMMIT
2014-01-03 17:28:48,230 INFO sqlalchemy.engine.base.Engine CREATE INDEX ix_users_email ON users (email)
2014-01-03 17:28:48,230 INFO sqlalchemy.engine.base.Engine ()
2014-01-03 17:28:48,231 INFO sqlalchemy.engine.base.Engine COMMIT

请注意,CREATE TABLE 语句不显示正在创建的索引,但它是在稍后的后续语句中创建的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 2016-01-15
    • 2010-12-07
    • 2015-03-14
    • 2018-10-01
    • 1970-01-01
    • 2013-09-11
    • 2020-05-12
    相关资源
    最近更新 更多