如何在sqlalchemy中为列创建非唯一索引?

4

我正在尝试在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”代码的? - Mark Hildreth
这个函数的第二个参数是 engine = create_engine('sqlite:///test.db', echo=True) - user784637
1个回答

4

请记住,SQLite要求您创建一个非唯一索引作为单独的语句,而不是像一些关系型数据库管理系统允许的那样在实际的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语句不会显示正在创建的索引,但是在稍后的跟进语句中确实正在创建。

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