Есть ли способ ретроактивно индексировать столбец sql-файла с Peewee? (т. е. тот, где начальная спецификация не была проиндексирована.) Запрашивать, потому что нужно быстрее выполнять все вставки, а затем индексировать, а не наоборот.Ретроактивно создавать индексы с Peewee?
ответ
Есть ли способ ретроактивно индексировать столбец 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.
Я хотел показать полный пример использования 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». Прокрутите вниз немного, чтобы найти примеры для «Добавление индекса».
Вы можете также, при использовании 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 также вполне приемлемо.