2016-09-17 5 views
3

Есть ли способ ретроактивно индексировать столбец sql-файла с Peewee? (т. е. тот, где начальная спецификация не была проиндексирована.) Запрашивать, потому что нужно быстрее выполнять все вставки, а затем индексировать, а не наоборот.Ретроактивно создавать индексы с Peewee?

ответ

2

Есть ли способ ретроактивно индексировать столбец sql-файла с Peewee?

Да. Pewee'sSchemaMigrator класс включает в себя поддержку adding an index:

add_index (таблица, столбцы [, уникальный = False])

стол (НТР) - имя таблицы, на которой для создания индекса.
столбцов (список) - список столбцов, которые должны быть indexed.unique
уникального (BOOL) - Будет ли новый индекс должен указать ограничение уникальности.

Если вы используете Pewee с pewee_migrate package, вы можете создать перенос базы данных для добавления индекса на таблицу, которая уже существует, так как:

unique_index = False 

def migrate(migrator, database, fake=False, **kwargs): 
    migrator.create_index('some_table', ('name_of_indexed_column',), unique_index) 

def rollback(migrator, database, fake=False, **kwargs): 
    migrator.drop_index('some_table', ('name_of_indexed_column',), unique_index) 

А потом run the migration.

1

Я хотел показать полный пример использования add_index (на который ссылается @doremi в другой ответ):

from peewee import SqliteDatabase 
from playhouse.migrate import SqliteMigrator, migrate 

db = SqliteDatabase('db.sqlite3') 
migrator = SqliteMigrator(db) 

migrate(
    # Create a unique, multi-column index 
    migrator.add_index('table_name', ('col1', 'col2'), True), 
) 

Заметьте, что это уникальный индекс нескольких столбцов (я добавляю индекс для уникальные значения на обоих столбцах col1 и col2 в table_name). Отрегулируйте код выше, чтобы он соответствовал вашим потребностям!

Документация доступна в разделе «Supported Operations». Прокрутите вниз немного, чтобы найти примеры для «Добавление индекса».

0

Вы можете также, при использовании Peewee 3.x, сделайте следующее:

db = SqliteDatabase(':memory:') 

class Note(Model): 
    content = TextField() 
    timestamp = TimestampField() 
    status = IntegerField() 

    class Meta: 
     database = db 

User.create_table() 
idx = Note.index('timestamp', 'status').where(Note.status == 1) 
db.execute(User._schema._create_index(idx)) 

Но использование Migrator также вполне приемлемо.