Source code for camelot.core.sql
# ============================================================================
#
# Copyright (C) 2007-2011 Conceptive Engineering bvba. All rights reserved.
# www.conceptive.be / project-camelot@conceptive.be
#
# This file is part of the Camelot Library.
#
# This file may be used under the terms of the GNU General Public
# License version 2.0 as published by the Free Software Foundation
# and appearing in the file license.txt included in the packaging of
# this file. Please review this information to ensure GNU
# General Public Licensing requirements will be met.
#
# If you are unsure which license is appropriate for your use, please
# visit www.python-camelot.com or contact project-camelot@conceptive.be
#
# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
# For use of this library in commercial applications, please contact
# project-camelot@conceptive.be
#
# ============================================================================
import logging
from functools import wraps
import sqlalchemy.sql.operators
from camelot.core.conf import settings
from camelot.core.exception import UserException
LOGGER = logging.getLogger('camelot.core.sql')
[docs]def like_op(column, string):
return sqlalchemy.sql.operators.like_op(column, '%%%s%%'%string)
[docs]def transaction(original_function):
"""Decorator for methods on an entity, to make them transactional"""
logger = logging.getLogger('camelot.core.sql.transaction')
@wraps( original_function )
def decorated_function(cls, *args, **kwargs):
session = cls.query.session
session.begin()
try:
result = original_function(cls, *args, **kwargs)
session.commit()
except Exception, e:
if not isinstance( e, (UserException,) ):
logger.error('Unhandled exception, rolling back transaction',
exc_info=e)
session.rollback()
raise e
return result
return decorated_function
[docs]def update_database_from_model():
"""Introspection the model and add missing columns in the database
this function can be ran in setup_model after setup_all(create_tables=True)
"""
migrate_engine = settings.ENGINE()
migrate_connection = migrate_engine.connect()
from sqlalchemy.schema import MetaData
from camelot.model import metadata
from migrate.versioning import schemadiff
from migrate.changeset import create_column
schema_diff = schemadiff.SchemaDiff(metadata, MetaData(migrate_connection, reflect=True))
for table_name, difference in schema_diff.tables_different.items():
for column in difference.columns_missing_from_B:
LOGGER.warn( 'column %s missing in table %s'%(column, table_name) )
table = metadata.tables[table_name]
create_column(column, table)