diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-04-02 21:36:11 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-04-02 21:36:11 +0000 |
commit | cdceb3c3714af707bfe3ede10af6536eaf529ca8 (patch) | |
tree | 2ccbfb60cd10d995c0309801b0adc4fc3a1f0a44 /lib/sqlalchemy/engine/strategies.py | |
parent | 8607de3159fd37923ae99118c499935c4a54d0e2 (diff) | |
download | sqlalchemy-cdceb3c3714af707bfe3ede10af6536eaf529ca8.tar.gz |
- merged the "execcontext" branch, refactors engine/dialect codepaths
- much more functionality moved into ExecutionContext, which impacted
the API used by dialects to some degree
- ResultProxy and subclasses now designed sanely
- merged patch for #522, Unicode subclasses String directly,
MSNVarchar implements for MS-SQL, removed MSUnicode.
- String moves its "VARCHAR"/"TEXT" switchy thing into
"get_search_list()" function, which VARCHAR and CHAR can override
to not return TEXT in any case (didnt do the latter yet)
- implements server side cursors for postgres, unit tests, #514
- includes overhaul of dbapi import strategy #480, all dbapi
importing happens in dialect method "dbapi()", is only called
inside of create_engine() for default and threadlocal strategies.
Dialect subclasses have a datamember "dbapi" referencing the loaded
module which may be None.
- added "mock" engine strategy, doesnt require DBAPI module and
gives you a "Connecition" which just sends all executes to a callable.
can be used to create string output of create_all()/drop_all().
Diffstat (limited to 'lib/sqlalchemy/engine/strategies.py')
-rw-r--r-- | lib/sqlalchemy/engine/strategies.py | 64 |
1 files changed, 60 insertions, 4 deletions
diff --git a/lib/sqlalchemy/engine/strategies.py b/lib/sqlalchemy/engine/strategies.py index 8ac721b77..1b760fca8 100644 --- a/lib/sqlalchemy/engine/strategies.py +++ b/lib/sqlalchemy/engine/strategies.py @@ -50,6 +50,16 @@ class DefaultEngineStrategy(EngineStrategy): if k in kwargs: dialect_args[k] = kwargs.pop(k) + dbapi = kwargs.pop('module', None) + if dbapi is None: + dbapi_args = {} + for k in util.get_func_kwargs(module.dbapi): + if k in kwargs: + dbapi_args[k] = kwargs.pop(k) + dbapi = module.dbapi(**dbapi_args) + + dialect_args['dbapi'] = dbapi + # create dialect dialect = module.dialect(**dialect_args) @@ -60,10 +70,6 @@ class DefaultEngineStrategy(EngineStrategy): # look for existing pool or create pool = kwargs.pop('pool', None) if pool is None: - dbapi = kwargs.pop('module', dialect.dbapi()) - if dbapi is None: - raise exceptions.InvalidRequestError("Can't get DBAPI module for dialect '%s'" % dialect) - def connect(): try: return dbapi.connect(*cargs, **cparams) @@ -73,6 +79,7 @@ class DefaultEngineStrategy(EngineStrategy): poolclass = kwargs.pop('poolclass', getattr(module, 'poolclass', poollib.QueuePool)) pool_args = {} + # consume pool arguments from kwargs, translating a few of the arguments for k in util.get_cls_kwargs(poolclass): tk = {'echo':'echo_pool', 'timeout':'pool_timeout', 'recycle':'pool_recycle'}.get(k, k) @@ -139,3 +146,52 @@ class ThreadLocalEngineStrategy(DefaultEngineStrategy): return threadlocal.TLEngine ThreadLocalEngineStrategy() + + +class MockEngineStrategy(EngineStrategy): + """Produces a single Connection object which dispatches statement executions + to a passed-in function""" + def __init__(self): + EngineStrategy.__init__(self, 'mock') + + def create(self, name_or_url, executor, **kwargs): + # create url.URL object + u = url.make_url(name_or_url) + + # get module from sqlalchemy.databases + module = u.get_module() + + dialect_args = {} + # consume dialect arguments from kwargs + for k in util.get_cls_kwargs(module.dialect): + if k in kwargs: + dialect_args[k] = kwargs.pop(k) + + # create dialect + dialect = module.dialect(**dialect_args) + + return MockEngineStrategy.MockConnection(dialect, executor) + + class MockConnection(base.Connectable): + def __init__(self, dialect, execute): + self._dialect = dialect + self.execute = execute + + engine = property(lambda s: s) + dialect = property(lambda s:s._dialect) + + def contextual_connect(self): + return self + + def create(self, entity, **kwargs): + kwargs['checkfirst'] = False + entity.accept_visitor(self.dialect.schemagenerator(self, **kwargs)) + + def drop(self, entity, **kwargs): + kwargs['checkfirst'] = False + entity.accept_visitor(self.dialect.schemadropper(self, **kwargs)) + + def execute(self, object, *multiparams, **params): + raise NotImplementedError() + +MockEngineStrategy()
\ No newline at end of file |