- MSSQL/PyODBC no longer has a global "set nocount on".
- - Firebird backend does properly reflect domains (partially fixing [ticket:410]).
+ - Firebird backend
+
+ - does properly reflect domains (partially fixing [ticket:410]) and
+ PassiveDefaults
+
+ - reverted to use default poolclass (was set to SingletonThreadPool in
+ 0.4.0 [3562] for test purposes)
+
+ - map func.length() to 'char_length' (easily overridable with the UDF
+ 'strlen' on old versions of Firebird)
+
0.4.1
-----
# instead of ``char_length``
FBCompiler.LENGTH_FUNCTION_NAME = 'strlen'
+Pooling connections
+-------------------
+
+The default strategy used by SQLAlchemy to pool the database connections
+in particular cases may raise an ``OperationalError`` with a message
+`"object XYZ is in use"`. This happens on Firebird when there are two
+connections to the database, one is using, or has used, a particular table
+and the other tries to drop or alter the same table. To garantee DDL
+operations success Firebird recommend doing them as the single connected user.
+
+In case your SA application effectively needs to do DDL operations while other
+connections are active, the following setting may alleviate the problem::
+
+ from sqlalchemy import pool
+ from sqlalchemy.databases.firebird import dialect
+
+ # Force SA to use a single connection per thread
+ dialect.poolclass = pool.SingletonThreadPool
+
.. [#] Well, that is not the whole story, as the client may still ask
a different (lower) dialect...
import datetime
import warnings
-from sqlalchemy import exceptions, pool, schema, types as sqltypes, sql, util
+from sqlalchemy import exceptions, schema, types as sqltypes, sql, util
from sqlalchemy.engine import base, default
dialect = FBDialect
-dialect.poolclass = pool.SingletonThreadPool
dialect.statement_compiler = FBCompiler
dialect.schemagenerator = FBSchemaGenerator
dialect.schemadropper = FBSchemaDropper