summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/engine/strategies.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-04-02 21:36:11 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-04-02 21:36:11 +0000
commitcdceb3c3714af707bfe3ede10af6536eaf529ca8 (patch)
tree2ccbfb60cd10d995c0309801b0adc4fc3a1f0a44 /lib/sqlalchemy/engine/strategies.py
parent8607de3159fd37923ae99118c499935c4a54d0e2 (diff)
downloadsqlalchemy-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.py64
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