summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2010-12-23 15:27:47 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2010-12-23 15:27:47 -0500
commit6cd730541f4e61fb8262ac50752c21cf1e7262ac (patch)
treef6dceb9d0be15e5a101d6119182eb227b86f2958 /lib/sqlalchemy
parente9d1b5b8de35dabc42d7dcf91c01783fa3133733 (diff)
downloadsqlalchemy-6cd730541f4e61fb8262ac50752c21cf1e7262ac.tar.gz
- restore declarative support for "composite"
- add an example of mutable scalars with events
Diffstat (limited to 'lib/sqlalchemy')
-rwxr-xr-xlib/sqlalchemy/ext/declarative.py4
-rw-r--r--lib/sqlalchemy/orm/attributes.py3
-rw-r--r--lib/sqlalchemy/orm/descriptor_props.py2
-rw-r--r--lib/sqlalchemy/orm/events.py10
-rw-r--r--lib/sqlalchemy/orm/mapper.py2
5 files changed, 17 insertions, 4 deletions
diff --git a/lib/sqlalchemy/ext/declarative.py b/lib/sqlalchemy/ext/declarative.py
index 40abfbb29..5d3c7d29d 100755
--- a/lib/sqlalchemy/ext/declarative.py
+++ b/lib/sqlalchemy/ext/declarative.py
@@ -928,7 +928,7 @@ from sqlalchemy.schema import Table, Column, MetaData, _get_table_key
from sqlalchemy.orm import synonym as _orm_synonym, mapper,\
comparable_property, class_mapper
from sqlalchemy.orm.interfaces import MapperProperty
-from sqlalchemy.orm.properties import RelationshipProperty, ColumnProperty
+from sqlalchemy.orm.properties import RelationshipProperty, ColumnProperty, CompositeProperty
from sqlalchemy.orm.util import _is_mapped_class
from sqlalchemy import util, exceptions
from sqlalchemy.sql import util as sql_util, expression
@@ -1083,7 +1083,7 @@ def _as_declarative(cls, classname, dict_):
# extract columns from the class dict
cols = []
for key, c in our_stuff.iteritems():
- if isinstance(c, ColumnProperty):
+ if isinstance(c, (ColumnProperty, CompositeProperty)):
for col in c.columns:
if isinstance(col, Column) and col.table is None:
_undefer_column_name(key, col)
diff --git a/lib/sqlalchemy/orm/attributes.py b/lib/sqlalchemy/orm/attributes.py
index 40a69d96a..ac6a498c7 100644
--- a/lib/sqlalchemy/orm/attributes.py
+++ b/lib/sqlalchemy/orm/attributes.py
@@ -149,7 +149,8 @@ def create_proxied_attribute(descriptor):
class Proxy(QueryableAttribute):
"""A combination of InsturmentedAttribute and a regular descriptor."""
- def __init__(self, key, descriptor, comparator, adapter=None):
+ def __init__(self, class_, key, descriptor, comparator, adapter=None):
+ self.class_ = class_
self.key = key
self.descriptor = descriptor
self._comparator = comparator
diff --git a/lib/sqlalchemy/orm/descriptor_props.py b/lib/sqlalchemy/orm/descriptor_props.py
index 3344ed888..a1498bfd4 100644
--- a/lib/sqlalchemy/orm/descriptor_props.py
+++ b/lib/sqlalchemy/orm/descriptor_props.py
@@ -75,6 +75,7 @@ class DescriptorProperty(MapperProperty):
proxy_attr = attributes.\
create_proxied_attribute(self.descriptor or descriptor)\
(
+ self.parent.class_,
self.key,
self.descriptor or descriptor,
lambda: self._comparator_factory(mapper)
@@ -94,6 +95,7 @@ class CompositeProperty(DescriptorProperty):
self.active_history = kwargs.get('active_history', False)
self.deferred = kwargs.get('deferred', False)
self.group = kwargs.get('group', None)
+ util.set_creation_order(self)
def fget(instance):
# this could be optimized to store the value in __dict__,
diff --git a/lib/sqlalchemy/orm/events.py b/lib/sqlalchemy/orm/events.py
index 6d1e8f713..f511b0e40 100644
--- a/lib/sqlalchemy/orm/events.py
+++ b/lib/sqlalchemy/orm/events.py
@@ -136,7 +136,15 @@ class InstanceEvents(event.Events):
initialized, depending on what's present in the result rows.
"""
-
+
+ def on_refresh(self, target):
+ """Receive an object instance after one or more attributes have
+ been refreshed.
+
+ This hook is called after expired attributes have been reloaded.
+
+ """
+
def on_resurrect(self, target):
"""Receive an object instance as it is 'resurrected' from
garbage collection, which occurs when a "dirty" state falls
diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py
index 91d512ad0..f2bc04570 100644
--- a/lib/sqlalchemy/orm/mapper.py
+++ b/lib/sqlalchemy/orm/mapper.py
@@ -2291,6 +2291,8 @@ class Mapper(object):
if loaded_instance:
state.manager.dispatch.on_load(state)
+ elif isnew:
+ state.manager.dispatch.on_refresh(state)
if result is not None:
if append_result: