No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

sqlutils.py 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import re
  4. import logging as logger
  5. import sqlalchemy as sqla
  6. from django.conf import settings
  7. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Lodel.settings")
  8. ENGINES = {'mysql': {
  9. 'driver': 'pymysql',
  10. 'encoding': 'utf8'
  11. },
  12. 'postgresql': {
  13. 'driver': 'psycopg2',
  14. 'encoding': 'utf8',
  15. },
  16. 'sqlite': {
  17. 'driver': 'pysqlite',
  18. 'encoding': 'utf8',
  19. },
  20. }
  21. sqlcfg = settings.LODEL2SQLWRAPPER
  22. ## Return an engine given a dbconf name
  23. # @param ename str: Its a name of an item in django.conf.settings.LODEL2SQLWRAPPER['db']
  24. # @param sqlalogging None|bool : If None leave default value, if true activate sqlalchemy logging
  25. # @return An sqlalchemy engine
  26. def getEngine(ename = 'default', sqlalogging = None):
  27. """ Return a sqlalchemy engine
  28. @param read bool: If True return the read engine, else
  29. return the write one
  30. @return a sqlachemy engine instance
  31. @todo Put the check on db config in SqlWrapper.checkConf()
  32. """
  33. #Loading confs
  34. cfg = sqlcfg['db'][ename]
  35. edata = ENGINES[cfg['ENGINE']] #engine infos
  36. conn_str = ""
  37. if cfg['ENGINE'] == 'sqlite':
  38. #Sqlite connection string
  39. conn_str = '%s+%s:///%s'%( cfg['ENGINE'],
  40. edata['driver'],
  41. cfg['NAME'])
  42. else:
  43. #Mysql and Postgres connection string
  44. user = cfg['USER']
  45. user += (':'+cfg['PASSWORD'] if 'PASSWORD' in cfg else '')
  46. if 'HOST' not in cfg:
  47. logger.info('Not HOST in configuration, using localhost')
  48. host = 'localhost'
  49. else:
  50. host = cfg['HOST']
  51. host += (':'+cfg['PORT'] if 'PORT' in cfg else '')
  52. conn_str = '%s+%s://'%(cfg['ENGINE'], edata['driver'])
  53. conn_str += '%s@%s/%s'%(user,host,cfg['NAME'])
  54. ret = sqla.create_engine(conn_str, encoding=edata['encoding'], echo=sqlalogging)
  55. logger.debug("Getting engine :"+str(ret))
  56. return ret
  57. ## Return a sqlalchemy.MetaData object
  58. # @param engine sqlalchemy.engine : A sqlalchemy engine
  59. # @return an sql alechemy MetaData instance bind to engine
  60. def meta(engine):
  61. res = sqla.MetaData()
  62. res.reflect(bind=engine)
  63. return res
  64. ## Return an sqlalchemy table given an EmComponent child class
  65. # @warning Except a class type not an instance
  66. # @param em_class : An EmComponent child class
  67. # @return An sqlalchemy table
  68. # @throw TypeError if em_instance is an EmComponent or not an EmComponent child class (or an instance)
  69. def getTable(cls):
  70. from EditorialModel.components import EmComponent #dirty circula inclusion hack
  71. if not issubclass(cls, EmComponent) or cls.table == None:
  72. raise TypeError("Excepting an EmComponent child class not an "+str(cls))
  73. engine = cls.getDbE()
  74. return sqla.Table(cls.table, meta(engine))
  75. def ddl_execute(ddl, db_engine):
  76. conn = db_engine.connect()
  77. req = str(ddl.compile(dialect=db_engine.dialect))
  78. logger.debug("Executing custom raw SQL query : '"+req+"'")
  79. ret = conn.execute(req)
  80. conn.close()
  81. return bool(ret)