Fix bug #1136278 by trying to detect when an upgrade has already been performed.

bzr-revno: 2191
Fixes: https://launchpad.net/bugs/1136278
This commit is contained in:
Raoul Snyman 2014-03-26 21:44:27 +02:00
commit 3aed29094f
3 changed files with 81 additions and 41 deletions

View File

@ -37,6 +37,7 @@ from sqlalchemy import Table, func, select, insert
__version__ = 1 __version__ = 1
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
def upgrade_setup(metadata): def upgrade_setup(metadata):
""" """
Set up the latest revision all tables, with reflection, needed for the Set up the latest revision all tables, with reflection, needed for the
@ -61,31 +62,37 @@ def upgrade_1(session, metadata, tables):
metadata_table = metadata.tables[u'metadata'] metadata_table = metadata.tables[u'metadata']
# Copy "Version" to "name" ("version" used by upgrade system) # Copy "Version" to "name" ("version" used by upgrade system)
# TODO: Clean up in a subsequent release of OpenLP (like 2.0 final) # TODO: Clean up in a subsequent release of OpenLP (like 2.0 final)
session.execute(insert(metadata_table).values( if select([metadata_table.c.value], metadata_table.c.key == u'Version')\
key=u'name', .as_scalar().execute().fetchall():
value=select( session.execute(insert(metadata_table).values(
[metadata_table.c.value], key=u'name',
metadata_table.c.key == u'Version' value=select(
).as_scalar() [metadata_table.c.value],
)) metadata_table.c.key == u'Version'
).as_scalar()
))
# Copy "Copyright" to "copyright" # Copy "Copyright" to "copyright"
# TODO: Clean up in a subsequent release of OpenLP (like 2.0 final) # TODO: Clean up in a subsequent release of OpenLP (like 2.0 final)
session.execute(insert(metadata_table).values( if select([metadata_table.c.value], metadata_table.c.key == u'Copyright')\
key=u'copyright', .as_scalar().execute().fetchall():
value=select( session.execute(insert(metadata_table).values(
[metadata_table.c.value], key=u'copyright',
metadata_table.c.key == u'Copyright' value=select(
).as_scalar() [metadata_table.c.value],
)) metadata_table.c.key == u'Copyright'
).as_scalar()
))
# Copy "Permissions" to "permissions" # Copy "Permissions" to "permissions"
# TODO: Clean up in a subsequent release of OpenLP (like 2.0 final) # TODO: Clean up in a subsequent release of OpenLP (like 2.0 final)
session.execute(insert(metadata_table).values( if select([metadata_table.c.value], metadata_table.c.key == u'Permissions')\
key=u'permissions', .as_scalar().execute().fetchall():
value=select( session.execute(insert(metadata_table).values(
[metadata_table.c.value], key=u'permissions',
metadata_table.c.key == u'Permissions' value=select(
).as_scalar() [metadata_table.c.value],
)) metadata_table.c.key == u'Permissions'
).as_scalar()
))
# Copy "Bookname language" to "book_name_language" # Copy "Bookname language" to "book_name_language"
# TODO: Clean up in a subsequent release of OpenLP (like 2.0 final) # TODO: Clean up in a subsequent release of OpenLP (like 2.0 final)
value_count = session.execute( value_count = session.execute(

View File

@ -30,18 +30,24 @@
The :mod:`upgrade` module provides a way for the database and schema that is the The :mod:`upgrade` module provides a way for the database and schema that is the
backend for the Songs plugin backend for the Songs plugin
""" """
import logging
from sqlalchemy import Column, Table, types from sqlalchemy import Column, Table, types
from sqlalchemy.exc import NoSuchTableError, OperationalError
from sqlalchemy.sql.expression import func from sqlalchemy.sql.expression import func
from migrate.changeset.constraint import ForeignKeyConstraint from migrate.changeset.constraint import ForeignKeyConstraint
log = logging.getLogger(__name__)
__version__ = 3 __version__ = 3
def upgrade_setup(metadata): def upgrade_setup(metadata):
""" """
Set up the latest revision all tables, with reflection, needed for the Set up the latest revision all tables, with reflection, needed for the
upgrade process. If you want to drop a table, you need to remove it from upgrade process. If you want to drop a table, you need to remove it from
here, and add it to your upgrade function. here, and add it to your upgrade function.
:param metadata: The SQLAlchemy metadata object
""" """
tables = { tables = {
u'authors': Table(u'authors', metadata, autoload=True), u'authors': Table(u'authors', metadata, autoload=True),
@ -66,16 +72,23 @@ def upgrade_1(session, metadata, tables):
In order to facilitate this one-to-many relationship, a song_id column is In order to facilitate this one-to-many relationship, a song_id column is
added to the media_files table, and a weight column so that the media added to the media_files table, and a weight column so that the media
files can be ordered. files can be ordered.
:param session: An SQLAlchemy Session object
:param metadata: An SQLAlchemy MetaData object
:param tables: A dictionary of tables
""" """
Table(u'media_files_songs', metadata, autoload=True).drop(checkfirst=True) try:
Column(u'song_id', types.Integer(), default=None)\ Table(u'media_files_songs', metadata, autoload=True).drop(checkfirst=True)
.create(table=tables[u'media_files']) Column(u'song_id', types.Integer(), default=None)\
Column(u'weight', types.Integer(), default=0)\ .create(table=tables[u'media_files'])
.create(table=tables[u'media_files']) Column(u'weight', types.Integer(), default=0)\
if metadata.bind.url.get_dialect().name != 'sqlite': .create(table=tables[u'media_files'])
# SQLite doesn't support ALTER TABLE ADD CONSTRAINT if metadata.bind.url.get_dialect().name != 'sqlite':
ForeignKeyConstraint([u'song_id'], [u'songs.id'], # SQLite doesn't support ALTER TABLE ADD CONSTRAINT
table=tables[u'media_files']).create() ForeignKeyConstraint([u'song_id'], [u'songs.id'],
table=tables[u'media_files']).create()
except (NoSuchTableError, OperationalError):
log.info(u'Upgrade 1 has already been run, continue with upgrade')
def upgrade_2(session, metadata, tables): def upgrade_2(session, metadata, tables):
@ -83,11 +96,18 @@ def upgrade_2(session, metadata, tables):
Version 2 upgrade. Version 2 upgrade.
This upgrade adds a create_date and last_modified date to the songs table This upgrade adds a create_date and last_modified date to the songs table
:param session: An SQLAlchemy Session object
:param metadata: An SQLAlchemy MetaData object
:param tables: A dictionary of tables
""" """
Column(u'create_date', types.DateTime(), default=func.now())\ try:
.create(table=tables[u'songs']) Column(u'create_date', types.DateTime(), default=func.now())\
Column(u'last_modified', types.DateTime(), default=func.now())\ .create(table=tables[u'songs'])
.create(table=tables[u'songs']) Column(u'last_modified', types.DateTime(), default=func.now())\
.create(table=tables[u'songs'])
except OperationalError:
log.info(u'Upgrade 2 has already been run, continue with upgrade')
def upgrade_3(session, metadata, tables): def upgrade_3(session, metadata, tables):
@ -95,7 +115,13 @@ def upgrade_3(session, metadata, tables):
Version 3 upgrade. Version 3 upgrade.
This upgrade adds a temporary song flag to the songs table This upgrade adds a temporary song flag to the songs table
"""
Column(u'temporary', types.Boolean(), default=False)\
.create(table=tables[u'songs'])
:param session: An SQLAlchemy Session object
:param metadata: An SQLAlchemy MetaData object
:param tables: A dictionary of tables
"""
try:
Column(u'temporary', types.Boolean(), default=False)\
.create(table=tables[u'songs'])
except OperationalError:
log.info(u'Upgrade 3 has already been run, continue with upgrade')

View File

@ -30,11 +30,15 @@
The :mod:`upgrade` module provides a way for the database and schema that is the The :mod:`upgrade` module provides a way for the database and schema that is the
backend for the SongsUsage plugin backend for the SongsUsage plugin
""" """
import logging
from sqlalchemy import Column, Table, types from sqlalchemy import Column, Table, types
from sqlalchemy.exc import OperationalError
log = logging.getLogger(__name__)
__version__ = 1 __version__ = 1
def upgrade_setup(metadata): def upgrade_setup(metadata):
""" """
Set up the latest revision all tables, with reflection, needed for the Set up the latest revision all tables, with reflection, needed for the
@ -53,7 +57,10 @@ def upgrade_1(session, metadata, tables):
This upgrade adds two new fields to the songusage database This upgrade adds two new fields to the songusage database
""" """
Column(u'plugin_name', types.Unicode(20), default=u'') \ try:
.create(table=tables[u'songusage_data'], populate_default=True) Column(u'plugin_name', types.Unicode(20), default=u'') \
Column(u'source', types.Unicode(10), default=u'') \ .create(table=tables[u'songusage_data'], populate_default=True)
.create(table=tables[u'songusage_data'], populate_default=True) Column(u'source', types.Unicode(10), default=u'') \
.create(table=tables[u'songusage_data'], populate_default=True)
except OperationalError:
log.info(u'Upgrade 1 has already been run, continue with upgrade')