update database on startup
This commit is contained in:
parent
69710090e0
commit
78c62d813e
4 changed files with 87 additions and 9 deletions
11
oml/db.py
11
oml/db.py
|
@ -121,3 +121,14 @@ def drop_columns(table, columns):
|
||||||
q = q.format(**info)
|
q = q.format(**info)
|
||||||
s.connection().execute(q)
|
s.connection().execute(q)
|
||||||
s.commit()
|
s.commit()
|
||||||
|
|
||||||
|
def get_layout():
|
||||||
|
layout = {
|
||||||
|
'tables': []
|
||||||
|
}
|
||||||
|
with session() as s:
|
||||||
|
sql = "SELECT name FROM sqlite_master WHERE type='table'"
|
||||||
|
layout['tables'] = sorted([r[0] for r in s.connection().execute(sql).fetchall() if not r[0].startswith('sqlite_')])
|
||||||
|
sql = "SELECT name FROM sqlite_master WHERE type='index'"
|
||||||
|
layout['indexes'] = sorted([r[0] for r in s.connection().execute(sql).fetchall() if not r[0].startswith('sqlite_')])
|
||||||
|
return layout
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# vi:si:et:sw=4:sts=4:ts=4
|
# vi:si:et:sw=4:sts=4:ts=4
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from io import BytesIO
|
|
||||||
import base64
|
import base64
|
||||||
import hashlib
|
import hashlib
|
||||||
import os
|
import os
|
||||||
|
@ -10,7 +9,6 @@ import shutil
|
||||||
import stat
|
import stat
|
||||||
import unicodedata
|
import unicodedata
|
||||||
|
|
||||||
from PIL import Image
|
|
||||||
import ox
|
import ox
|
||||||
from sqlalchemy.schema import CreateTable
|
from sqlalchemy.schema import CreateTable
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
@ -801,3 +799,13 @@ def update_sort_table():
|
||||||
for q in sql:
|
for q in sql:
|
||||||
s.connection().execute(q)
|
s.connection().execute(q)
|
||||||
s.commit()
|
s.commit()
|
||||||
|
layout = db.get_layout()
|
||||||
|
sort_indexes = [i[len('ix_sort_'):] for i in layout['indexes'] if i.startswith('ix_sort_')]
|
||||||
|
sql = []
|
||||||
|
for col in set(Item.sort_keys)-set(sort_indexes):
|
||||||
|
sql.append('CREATE INDEX ix_sort_{col} ON sort ({col})'.format(col=col))
|
||||||
|
if sql:
|
||||||
|
with db.session() as s:
|
||||||
|
for q in sql:
|
||||||
|
s.connection().execute(q)
|
||||||
|
s.commit()
|
||||||
|
|
71
oml/setup.py
71
oml/setup.py
|
@ -103,7 +103,6 @@ CREATE TABLE sort (
|
||||||
author VARCHAR(1000),
|
author VARCHAR(1000),
|
||||||
publisher VARCHAR(1000),
|
publisher VARCHAR(1000),
|
||||||
place VARCHAR(1000),
|
place VARCHAR(1000),
|
||||||
country VARCHAR(1000),
|
|
||||||
date VARCHAR(1000),
|
date VARCHAR(1000),
|
||||||
language VARCHAR(1000),
|
language VARCHAR(1000),
|
||||||
pages BIGINT,
|
pages BIGINT,
|
||||||
|
@ -126,7 +125,6 @@ CREATE TABLE sort (
|
||||||
CREATE INDEX ix_sort_accessed ON sort (accessed);
|
CREATE INDEX ix_sort_accessed ON sort (accessed);
|
||||||
CREATE INDEX ix_sort_added ON sort (added);
|
CREATE INDEX ix_sort_added ON sort (added);
|
||||||
CREATE INDEX ix_sort_author ON sort (author);
|
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_created ON sort (created);
|
||||||
CREATE INDEX ix_sort_date ON sort (date);
|
CREATE INDEX ix_sort_date ON sort (date);
|
||||||
CREATE INDEX ix_sort_extension ON sort (extension);
|
CREATE INDEX ix_sort_extension ON sort (extension);
|
||||||
|
@ -164,8 +162,10 @@ PRAGMA journal_mode=WAL
|
||||||
'''
|
'''
|
||||||
for statement in sql.split(';'):
|
for statement in sql.split(';'):
|
||||||
run_sql(statement)
|
run_sql(statement)
|
||||||
upgrade_db('0')
|
|
||||||
create_default_lists()
|
create_default_lists()
|
||||||
|
settings.server['db_version'] = settings.DB_VERSION
|
||||||
|
update_database()
|
||||||
|
|
||||||
|
|
||||||
def upgrade_db(old, new=None):
|
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 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)')
|
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):
|
def create_default_lists(user_id=None):
|
||||||
with db.session():
|
with db.session():
|
||||||
|
@ -470,3 +468,66 @@ def create_default_lists(user_id=None):
|
||||||
if not l:
|
if not l:
|
||||||
l = List.create(user_id, list['title'], list.get('query'))
|
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()
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,6 @@ from io import StringIO, BytesIO
|
||||||
import re
|
import re
|
||||||
import stdnum.isbn
|
import stdnum.isbn
|
||||||
import socket
|
import socket
|
||||||
import io
|
|
||||||
import gzip
|
|
||||||
import time
|
import time
|
||||||
import hashlib
|
import hashlib
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
Loading…
Reference in a new issue