def __init__(self, configuration): """ Constructs the DatabaseConnector object and connects to the database specified by the options given in databaseSettings. To connect to a database give ``{'sqlalchemy.url': 'driver://*****:*****@host/database'``} as configuration. Further databases can be attached by passing a list of URLs or names for keyword ``'attach'``. .. seealso:: documentation of sqlalchemy.create_engine() :type configuration: dict :param configuration: database connection options for SQLAlchemy """ if not configuration: configuration = {} elif isinstance(configuration, basestring): # backwards compatibility to option databaseUrl configuration = {'sqlalchemy.url': configuration} else: configuration = configuration.copy() # allow 'url' as parameter, but move to 'sqlalchemy.url' if 'url' in configuration: if ('sqlalchemy.url' in configuration and configuration['sqlalchemy.url'] != configuration['url']): raise ValueError("Two different URLs specified" " for 'url' and 'sqlalchemy.url'." "Check your configuration.") else: configuration['sqlalchemy.url'] = configuration.pop('url') self.databaseUrl = configuration['sqlalchemy.url'] """Database url""" registerUnicode = configuration.pop('registerUnicode', False) if isinstance(registerUnicode, basestring): registerUnicode = (registerUnicode.lower() in ['1', 'yes', 'true', 'on']) self.registerUnicode = registerUnicode self.engine = engine_from_config(configuration, prefix='sqlalchemy.') """SQLAlchemy engine object""" self.connection = self.engine.connect() """SQLAlchemy database connection object""" self.metadata = MetaData(bind=self.connection) """SQLAlchemy metadata object""" # multi-database table access self.tables = LazyDict(self._tableGetter()) """Dictionary of SQLAlchemy table objects""" if self.engine.name == 'sqlite': # Main database can be prefixed with 'main.' self._mainSchema = 'main' else: # MySQL uses database name for prefix self._mainSchema = self.engine.url.database # attach other databases self.attached = OrderedDict() """Mapping of attached database URLs to internal schema names""" attach = configuration.pop('attach', []) searchPaths = self.engine.name == 'sqlite' for url in self._findAttachableDatabases(attach, searchPaths): self.attachDatabase(url) # register unicode functions self.compatibilityUnicodeSupport = False if self.registerUnicode: self._registerUnicode()