dialect-specific types is now a WeakKeyDictionary.
This to prevent dialect objects from
being referenced forever for an application that
creates an arbitrarily large number of engines
or dialects. There is a small performance penalty
which will be resolved in 0.6. [ticket:1299]
- sql
- the __selectable__() interface has been replaced entirely
by __clause_element__().
+
+ - The per-dialect cache used by TypeEngine to cache
+ dialect-specific types is now a WeakKeyDictionary.
+ This to prevent dialect objects from
+ being referenced forever for an application that
+ creates an arbitrarily large number of engines
+ or dialects. There is a small performance penalty
+ which will be resolved in 0.6. [ticket:1299]
0.5.2
======
import inspect
import datetime as dt
from decimal import Decimal as _python_Decimal
-
+import weakref
from sqlalchemy import exc
from sqlalchemy.util import pickle
import sqlalchemy.util as util
try:
return self._impl_dict[dialect]
except AttributeError:
- self._impl_dict = {}
+ self._impl_dict = weakref.WeakKeyDictionary() # will be optimized in 0.6
return self._impl_dict.setdefault(dialect, dialect.type_descriptor(self))
except KeyError:
return self._impl_dict.setdefault(dialect, dialect.type_descriptor(self))
def __getstate__(self):
d = self.__dict__.copy()
- d['_impl_dict'] = {}
+ d['_impl_dict'] = weakref.WeakKeyDictionary() # will be optimized in 0.6
return d
def get_col_spec(self):
try:
return self._impl_dict[dialect]
except AttributeError:
- self._impl_dict = {}
+ self._impl_dict = weakref.WeakKeyDictionary() # will be optimized in 0.6
except KeyError:
pass
import operator
from testlib import testing
from testlib.sa import MetaData, Table, Column, Integer, String, ForeignKey, PickleType
+import sqlalchemy as sa
+from sqlalchemy.sql import column
from orm import _base
go()
finally:
metadata.drop_all()
+
+ def test_type_compile(self):
+ from sqlalchemy.databases.sqlite import SQLiteDialect
+ cast = sa.cast(column('x'), sa.Integer)
+ @profile_memory
+ def go():
+ dialect = SQLiteDialect()
+ cast.compile(dialect=dialect)
+ go()
if __name__ == '__main__':
testenv.main()