From b45e7ea4ee7703b8316fa6f855585959de07d264 Mon Sep 17 00:00:00 2001 From: Yann Date: Fri, 19 Jun 2015 16:12:40 +0200 Subject: [PATCH] Added an getTable function to sqlutils It takes an EmComponent child class as parameter and return an sqlalchemy Table --- Database/sqlutils.py | 110 +++++++++++++++++++++++++------------------ 1 file changed, 65 insertions(+), 45 deletions(-) diff --git a/Database/sqlutils.py b/Database/sqlutils.py index 0945eff..f367472 100644 --- a/Database/sqlutils.py +++ b/Database/sqlutils.py @@ -10,64 +10,84 @@ from django.conf import settings os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Lodel.settings") ENGINES = {'mysql': { - 'driver': 'pymysql', - 'encoding': 'utf8' - }, - 'postgresql': { - 'driver': 'psycopg2', - 'encoding': 'utf8', - }, - 'sqlite': { - 'driver': 'pysqlite', - 'encoding': 'utf8', - }, + 'driver': 'pymysql', + 'encoding': 'utf8' + }, + 'postgresql': { + 'driver': 'psycopg2', + 'encoding': 'utf8', + }, + 'sqlite': { + 'driver': 'pysqlite', + 'encoding': 'utf8', + }, } sqlcfg = settings.LODEL2SQLWRAPPER +## Return an engine given a dbconf name +# @param ename str: Its a name of an item in django.conf.settings.LODEL2SQLWRAPPER['db'] +# @param sqlalogging None|bool : If None leave default value, if true activate sqlalchemy logging +# @return An sqlalchemy engine def getEngine(ename = 'default', sqlalogging = None): - """ Return a sqlalchemy engine - @param read bool: If True return the read engine, else - return the write one - @return a sqlachemy engine instance + """ Return a sqlalchemy engine + @param read bool: If True return the read engine, else + return the write one + @return a sqlachemy engine instance - @todo Put the check on db config in SqlWrapper.checkConf() - """ - #Loading confs - cfg = sqlcfg['db'][ename] + @todo Put the check on db config in SqlWrapper.checkConf() + """ + #Loading confs + cfg = sqlcfg['db'][ename] - edata = ENGINES[cfg['ENGINE']] #engine infos - conn_str = "" + edata = ENGINES[cfg['ENGINE']] #engine infos + conn_str = "" - if cfg['ENGINE'] == 'sqlite': - #Sqlite connection string - conn_str = '%s+%s:///%s'%( cfg['ENGINE'], - edata['driver'], - cfg['NAME']) - else: - #Mysql and Postgres connection string - user = cfg['USER'] - user += (':'+cfg['PASSWORD'] if 'PASSWORD' in cfg else '') - - if 'HOST' not in cfg: - logger.info('Not HOST in configuration, using localhost') - host = 'localhost' - else: - host = cfg['HOST'] + if cfg['ENGINE'] == 'sqlite': + #Sqlite connection string + conn_str = '%s+%s:///%s'%( cfg['ENGINE'], + edata['driver'], + cfg['NAME']) + else: + #Mysql and Postgres connection string + user = cfg['USER'] + user += (':'+cfg['PASSWORD'] if 'PASSWORD' in cfg else '') + + if 'HOST' not in cfg: + logger.info('Not HOST in configuration, using localhost') + host = 'localhost' + else: + host = cfg['HOST'] - host += (':'+cfg['PORT'] if 'PORT' in cfg else '') + host += (':'+cfg['PORT'] if 'PORT' in cfg else '') - conn_str = '%s+%s://'%(cfg['ENGINE'], edata['driver']) - conn_str += '%s@%s/%s'%(user,host,cfg['NAME']) + conn_str = '%s+%s://'%(cfg['ENGINE'], edata['driver']) + conn_str += '%s@%s/%s'%(user,host,cfg['NAME']) - ret = sqla.create_engine(conn_str, encoding=edata['encoding'], echo=sqlalogging) + ret = sqla.create_engine(conn_str, encoding=edata['encoding'], echo=sqlalogging) - logger.debug("Getting engine :"+str(ret)) + logger.debug("Getting engine :"+str(ret)) - return ret + return ret +## Return a sqlalchemy.MetaData object +# @param engine sqlalchemy.engine : A sqlalchemy engine +# @return an sql alechemy MetaData instance bind to engine def meta(engine): - res = sqla.MetaData() - res.reflect(bind=engine) - return res + res = sqla.MetaData() + res.reflect(bind=engine) + return res + +## Return an sqlalchemy table given an EmComponent child class +# @warning Except a class type not an instance +# @param em_class : An EmComponent child class +# @return An sqlalchemy table +# @throw TypeError if em_instance is an EmComponent or not an EmComponent child class (or an instance) +def getTable(cls): + from EditorialModel.components import EmComponent #dirty circula inclusion hack + if not issubclass(cls, EmComponent) or cls.table == None: + raise TypeError("Excepting an EmComponent child class not an "+str(cls)) + engine = cls.getDbE() + return sqla.Table(cls.table, meta(engine)) +