Mike Bayer [Sun, 1 Aug 2010 22:24:35 +0000 (18:24 -0400)]
- The name ConcurrentModificationError has been
changed to StaleDataError, and descriptive
error messages have been revised to reflect
exactly what the issue is. Both names will
remain available for the forseeable future
for schemes that may be specifying
ConcurrentModificationError in an "except:"
clause.
Mike Bayer [Sun, 1 Aug 2010 18:07:35 +0000 (14:07 -0400)]
- Repaired the usage of merge() when used with
concrete inheriting mappers. Such mappers frequently
have so-called "concrete" attributes, which are
subclass attributes that "disable" propagation from
the parent - these needed to allow a merge()
operation to pass through without effect.
Mike Bayer [Sat, 24 Jul 2010 14:10:28 +0000 (10:10 -0400)]
- The value of version_id_col can be changed
manually, and this will result in an UPDATE
of the row. Versioned UPDATEs and DELETEs
now use the "committed" value of the
version_id_col in the WHERE clause and
not the pending changed value. The
version generator is also bypassed if
manual changes are present on the attribute.
[ticket:1857]
- ensure before_update/after_update called on parent
for collection change
Mike Bayer [Thu, 22 Jul 2010 05:46:41 +0000 (01:46 -0400)]
- Moving an o2m object from one collection to
another, or vice versa changing the referenced
object by an m2o, where the foreign key is also a
member of the primary key, will now be more
carefully checked during flush if the change in
value of the foreign key on the "many" side is the
result of a change in the primary key of the "one"
side, or if the "one" is just a different object.
In one case, a cascade-capable DB would have
cascaded the value already and we need to look at
the "new" PK value to do an UPDATE, in the other we
need to continue looking at the "old". We now look
at the "old", assuming passive_updates=True,
unless we know it was a PK switch that
triggered the change. [ticket:1856]
Mike Bayer [Wed, 21 Jul 2010 20:19:08 +0000 (16:19 -0400)]
- The beaker_caching example has been reorgnized
such that the Session, cache manager,
declarative_base are part of environment, and
custom cache code is portable and now within
"caching_query.py". This allows the example to
be easier to "drop in" to existing projects.
Mike Bayer [Wed, 21 Jul 2010 15:33:47 +0000 (11:33 -0400)]
- Changed the scheme used to generate truncated
"auto" index names when using the "index=True"
flag on Column. The truncation only takes
place with the auto-generated name, not one
that is user-defined (an error would be
raised instead), and the truncation scheme
itself is now based on a fragment of an md5
hash of the identifier name, so that multiple
indexes on columns with similar names still
have unique names. [ticket:1855]
Mike Bayer [Thu, 15 Jul 2010 13:59:17 +0000 (09:59 -0400)]
- Column-entities (i.e. query(Foo.id)) copy their
state more fully when queries are derived from
themselves + a selectable (i.e. from_self(),
union(), etc.), so that join() and such have the
correct state to work from. [ticket:1853]
- Fixed bug where Query.join() would fail if
querying a non-ORM column then joining without
an on clause when a FROM clause is already
present, now raises a checked exception the
same way it does when the clause is not
present. [ticket:1853]
Mike Bayer [Wed, 14 Jul 2010 18:50:45 +0000 (14:50 -0400)]
- More tweaks to cx_oracle Decimal handling.
"Ambiguous" numerics with no decimal place
are coerced to int at the connection handler
level. The advantage here is that ints
come back as ints without SQLA type
objects being involved and without needless
conversion to Decimal first.
Unfortunately, some exotic subquery cases
can even see different types between
individual result rows, so the Numeric
handler, when instructed to return Decimal,
can't take full advantage of "native decimal"
mode and must run isinstance() on every value
to check if its Decimal already. Reopen of
[ticket:1840]
Mike Bayer [Wed, 14 Jul 2010 01:30:55 +0000 (21:30 -0400)]
- PG doc updates
- pypostgresql has 15 errors, 3 failures, this probably
puts it in the "yes" as opposed to the "partial" support
category. [ticket:1850]
Mike Bayer [Wed, 14 Jul 2010 00:52:05 +0000 (20:52 -0400)]
- _extract_error_code now expects the raw DBAPI error in all cases
for all four MySQL dialects. has_table() passes in the "orig"
from the SQLAlchemy exception. continuing of [ticket:1848]
Mike Bayer [Tue, 13 Jul 2010 15:55:08 +0000 (11:55 -0400)]
- pull out type() ahead of time to cut down on fn calls.
Would replace this with set(dir(self)) but not sure if some
class schemes may have issues with dir() (also for low numbers
of args, not using the set() probably faster).
Mike Bayer [Mon, 12 Jul 2010 15:15:16 +0000 (11:15 -0400)]
- The _extract_error_code() method now works
correctly with the "mysqldb" dialect. Previously,
the reconnect logic would fail for OperationalError
conditions, however since MySQLdb has its
own reconnect feature, there was no symptom
here unless one watched the logs.
[ticket:1848]
Mike Bayer [Thu, 8 Jul 2010 22:17:23 +0000 (18:17 -0400)]
- added "expr" to the column descriptions accessor, this is
an expression that matches on identity the original expression
passed to the query. In particular you can pass it into order_by()
and similar.
Mike Bayer [Thu, 8 Jul 2010 18:13:56 +0000 (14:13 -0400)]
- 78 chars
- Added "column_descriptions" accessor to Query,
returns a list of dictionaries containing
naming/typing information about the entities
the Query will return. Can be helpful for
building GUIs on top of ORM queries.
Mike Bayer [Thu, 8 Jul 2010 14:16:13 +0000 (10:16 -0400)]
- Improved the check for an "unmapped class",
including the case where the superclass is mapped
but the subclass is not. Any attempts to access
cls._sa_class_manager.mapper now raise
UnmappedClassError(). [ticket:1142]
Mike Bayer [Wed, 7 Jul 2010 16:01:02 +0000 (12:01 -0400)]
- Removed errant many-to-many load in unitofwork
which triggered unnecessarily on expired/unloaded
collections. This load now takes place only if
passive_updates is False and the parent primary
key has changed, or if passive_deletes is False
and a delete of the parent has occurred.
[ticket:1845]
Mike Bayer [Mon, 5 Jul 2010 23:54:46 +0000 (19:54 -0400)]
- latest distribute
- added caveats to unittest README encountered with Py2.7 + current nose 0.11.3
- call counts for py2.7. all tests pass for sqlite + mysql-python + psycopg2
Mike Bayer [Sat, 3 Jul 2010 18:53:37 +0000 (14:53 -0400)]
- Added support for @classproperty to provide
any kind of schema/mapping construct from a
declarative mixin, including columns with foreign
keys, relationships, column_property, deferred.
This solves all such issues on declarative mixins.
An error is raised if any MapperProperty subclass
is specified on a mixin without using @classproperty.
[ticket:1751] [ticket:1796] [ticket:1805]
Mike Bayer [Fri, 2 Jul 2010 18:07:42 +0000 (14:07 -0400)]
- The 'default' compiler is automatically copied over
when overriding the compilation of a built in
clause construct, so no KeyError is raised if the
user-defined compiler is specific to certain
backends and compilation for a different backend
is invoked. [ticket:1838]
Mike Bayer [Fri, 2 Jul 2010 17:55:24 +0000 (13:55 -0400)]
- add typing/operator converts to Float/Numeric to get Oracle tests going again,
as we have an unusually high level of dependence on SQLA typing now
- force oracle seqs to return integers
Mike Bayer [Fri, 2 Jul 2010 16:57:15 +0000 (12:57 -0400)]
- If server_version_info is outside the usual
range of (8, ), (9, ), (10, ), a warning is emitted
which suggests checking that the FreeTDS version
configuration is using 7.0 or 8.0, not 4.2.
[ticket:1825]
Mike Bayer [Fri, 2 Jul 2010 00:50:57 +0000 (20:50 -0400)]
- Query.join() will check for a call of the
form query.join(target, clause_expression),
i.e. missing the tuple, and raise an informative
error message that this is the wrong calling form.
Mike Bayer [Thu, 1 Jul 2010 20:57:02 +0000 (16:57 -0400)]
- Oracle's "native decimal" metadata begins to return
ambiguous typing information about numerics
when columns are embedded in subqueries as well
as when ROWNUM is consulted with subqueries, as we
do for limit/offset. We've added these ambiguous
conditions to the cx_oracle "convert to Decimal()"
handler, so that we receive numerics as Decimal
in more cases instead of as floats. These are
then converted, if requested, into Integer
or Float, or otherwise kept as the lossless
Decimal [ticket:1840].
Mike Bayer [Wed, 30 Jun 2010 20:12:32 +0000 (16:12 -0400)]
- An instance which is moved to "transient", has
an incomplete or missing set of primary key
attributes, and contains expired attributes, will
raise an InvalidRequestError if an expired attribute
is accessed, instead of getting a recursion overflow.
- make_transient() removes all "loader" callables from
the state being made transient, removing any
"expired" state - all unloaded attributes reset back
to undefined, None/empty on access.
Mike Bayer [Tue, 29 Jun 2010 23:02:49 +0000 (19:02 -0400)]
replace all occurences of "closes the connection" "closes the transaction"
with explicit verbiage regarding "returns the connection to the connection
pool", "rolls back the transaction"
Mike Bayer [Fri, 25 Jun 2010 17:11:06 +0000 (13:11 -0400)]
- Won't generate "CREATE TYPE" / "DROP TYPE" if
using types.Enum on a PG version prior to 8.3 -
the supports_native_enum flag is fully
honored. [ticket:1836]
Mike Bayer [Thu, 24 Jun 2010 16:19:15 +0000 (12:19 -0400)]
- The argument to "ESCAPE" of a LIKE operator or similar
is passed through render_literal_value(), which may
implement escaping of backslashes. [ticket:1400]
- Postgresql render_literal_value() is overridden which escapes
backslashes, currently applies to the ESCAPE clause
of LIKE and similar expressions.
Ultimately this will have to detect the value of
"standard_conforming_strings" for full behavior.
[ticket:1400]
- MySQL render_literal_value() is overridden which escapes
backslashes, currently applies to the ESCAPE clause
of LIKE and similar expressions. This behavior
is derived from detecting the value of
NO_BACKSLASH_ESCAPES. [ticket:1400]
Mike Bayer [Sat, 19 Jun 2010 18:08:20 +0000 (14:08 -0400)]
- Fixed @memoized_property and @memoized_instancemethod
decorators so that Sphinx documentation picks up
these attributes and methods, such as
ResultProxy.inserted_primary_key. [ticket:1830]
Mike Bayer [Sat, 19 Jun 2010 17:25:37 +0000 (13:25 -0400)]
- a mixin class can now define a column that matches
one which is present on a __table__ defined on a
subclass. It cannot, however, define one that is
not present in the __table__, and the error message
here now works. [ticket:1821]
Mike Bayer [Fri, 18 Jun 2010 17:31:51 +0000 (13:31 -0400)]
this one is actually doing it. removed the cruft we don't need from the old approach.
not sure if one-to-many with elaborate self-refs, etc., but we appear to be
as good as we were before.
Mike Bayer [Fri, 18 Jun 2010 15:36:35 +0000 (11:36 -0400)]
this approach seems to allow many-to-one post updates to occur as a single action. for one-to-many, we
have it working the old way still. as usual the huge job is the tests. also I am not yet certain
that post updates can always be a "full mapper" operation, i.e. are never involved in per-state dependencies,
or even if the old approach supports that.
Mike Bayer [Thu, 17 Jun 2010 19:53:07 +0000 (15:53 -0400)]
- query.order_by() now accepts False, which cancels
any existing order_by() state on the Query, allowing
subsequent generative methods to be called which do
not support ORDER BY. This is not the same as the
already existing feature of passing None, which
suppresses any existing order_by() settings, including
those configured on the mapper. False will make it
as though order_by() was never called, while
None is an active setting.
Mike Bayer [Tue, 15 Jun 2010 18:04:13 +0000 (14:04 -0400)]
- Can now call make_transient() on an instance that
is referenced by parent objects via many-to-one,
without the parent's foreign key value getting
temporarily set to None - this was a function
of the "detect primary key switch" flush handler.
It now ignores objects that are no longer
in the "persistent" state, and the parent's
foreign key identifier is left unaffected.
Mike Bayer [Tue, 15 Jun 2010 00:07:44 +0000 (20:07 -0400)]
- Query.statement, Query.subquery(), etc. now transfer
the values of bind parameters, i.e. those specified
by query.params(), into the resulting SQL expression.
Previously the values would not be transferred
and bind parameters would come out as None.
- Subquery-eager-loading now works with Query objects
which include params(), as well as get() Queries.
Mike Bayer [Mon, 14 Jun 2010 23:39:26 +0000 (19:39 -0400)]
- Modified the internals of "column annotation" such that
a custom Column subclass can safely override
_constructor to return Column, for the purposes of
making "configurational" column classes that aren't
involved in proxying, etc.
Mike Bayer [Sun, 13 Jun 2010 20:25:26 +0000 (16:25 -0400)]
- Fixed bug regarding flushes on self-referential
bi-directional many-to-many relationships, where
two objects made to mutually reference each other
in one flush would fail to insert a row for both
sides. Regression from 0.5. [ticket:1824]
Mike Bayer [Sun, 13 Jun 2010 20:09:13 +0000 (16:09 -0400)]
- The warning emitted by the Unicode and String types
with convert_unicode=True no longer embeds the actual
value passed. This so that the Python warning
registry does not continue to grow in size, the warning
is emitted once as per the warning filter settings,
and large string values don't pollute the output.
[ticket:1822]
Mike Bayer [Sun, 13 Jun 2010 19:49:27 +0000 (15:49 -0400)]
- added documentation for Inspector [ticket:1820]
- fixed "toplevel" regexp to include tokens of the form foo-bar-toplevel (i.e. multiple dashes)
- some CSS adjustment so that all API headings are in gray.
Mike Bayer [Fri, 11 Jun 2010 15:38:06 +0000 (11:38 -0400)]
- Inspector hits bind.connect() when invoked to ensure
initialize has been called. the internal name ".conn"
is changed to ".bind", since that's what it is.