update database on startup

This commit is contained in:
j 2016-01-17 11:59:06 +05:30
commit 78c62d813e
4 changed files with 87 additions and 9 deletions

View file

@ -103,7 +103,6 @@ CREATE TABLE sort (
author VARCHAR(1000),
publisher VARCHAR(1000),
place VARCHAR(1000),
country VARCHAR(1000),
date VARCHAR(1000),
language VARCHAR(1000),
pages BIGINT,
@ -126,7 +125,6 @@ CREATE TABLE sort (
CREATE INDEX ix_sort_accessed ON sort (accessed);
CREATE INDEX ix_sort_added ON sort (added);
CREATE INDEX ix_sort_author ON sort (author);
CREATE INDEX ix_sort_country ON sort (country);
CREATE INDEX ix_sort_created ON sort (created);
CREATE INDEX ix_sort_date ON sort (date);
CREATE INDEX ix_sort_extension ON sort (extension);
@ -164,8 +162,10 @@ PRAGMA journal_mode=WAL
'''
for statement in sql.split(';'):
run_sql(statement)
upgrade_db('0')
create_default_lists()
settings.server['db_version'] = settings.DB_VERSION
update_database()
def upgrade_db(old, new=None):
@ -457,8 +457,6 @@ def upgrade_db(old, new=None):
)''')
run_sql('CREATE UNIQUE INDEX IF NOT EXISTS user_metadata_index ON user_metadata(id, user_id)')
run_sql('CREATE INDEX ix_user_metadata_data_hash ON user_metadata (data_hash)')
import item.models
item.models.update_sort_table()
def create_default_lists(user_id=None):
with db.session():
@ -470,3 +468,66 @@ def create_default_lists(user_id=None):
if not l:
l = List.create(user_id, list['title'], list.get('query'))
def update_database():
import sqlalchemy as sa
from sqlalchemy.schema import CreateTable
import changelog
import item.models
import item.person
import user.models
tables = [
changelog.Changelog,
item.models.File,
item.models.Find,
item.models.Item,
item.models.Metadata,
item.models.Scrape,
item.models.Sort,
item.models.Transfer,
item.models.user_items,
item.person.Person,
user.models.List,
user.models.List,
user.models.list_items,
user.models.Metadata,
user.models.User,
]
indexes = [
'CREATE INDEX idx_scrape_added ON scrape (added)',
'CREATE INDEX ix_find_findvalue ON find (findvalue)',
'CREATE INDEX ix_find_key ON find ("key")',
'CREATE INDEX ix_useritem_user ON useritem ("user_id")',
'CREATE INDEX ix_user_metadata_data_hash ON user_metadata (data_hash)',
'CREATE UNIQUE INDEX listitem_index on listitem(list_id,item_id)',
'CREATE UNIQUE INDEX useritem_index on useritem(user_id,item_id)',
'CREATE UNIQUE INDEX user_metadata_index ON user_metadata(id, user_id)',
]
layout = db.get_layout()
sql = []
for t in tables:
if isinstance(t, sa.Table):
table = t
else:
table = t.__table__
name = table.name
if name not in layout['tables']:
create_table = str(CreateTable(table).compile(db.engine))
sql.append(create_table)
index_names = set()
for index in indexes:
name = index.split('INDEX ')[1].split()[0]
if name not in layout['indexes']:
sql.append(index)
index_names.add(name)
for index in set(name for name in layout['indexes'] if not name.startswith('ix_sort_')) - index_names:
sql.append('DROP INDEX ' + index)
if sql:
with db.session() as s:
for q in sql:
s.connection().execute(q)
s.commit()
import item.models
item.models.update_sort_table()