0.1 Changelog

    • [no_tags]

      some fixes to topological sort algorithm

    • [no_tags]

      added DISTINCT ON support to Postgres (just supply distinct=[col1,col2..])

    • [no_tags]

      added __mod__ (% operator) to sql expressions

    • [no_tags]

      ”order_by” mapper property inherited from inheriting mapper

    • [no_tags]

      fix to column type used when mapper UPDATES/DELETEs

    • [no_tags]

      with convert_unicode=True, reflection was failing, has been fixed

    • [no_tags]

      types types types! still weren’t working….have to use TypeDecorator again :(

    • [no_tags]

      mysql binary type converts array output to buffer, fixes PickleType

    • [no_tags]

      fixed the attributes.py memory leak once and for all

    • [no_tags]

      unittests are qualified based on the databases that support each one

    • [no_tags]

      fixed bug where column defaults would clobber VALUES clause of insert objects

    • [no_tags]

      fixed bug where table def w/ schema name would force engine connection

    • [no_tags]

      fix for parenthesis to work correctly with subqueries in INSERT/UPDATE

    • [no_tags]

      HistoryArraySet gets extend() method

    • [no_tags]

      fixed lazyload support for other comparison operators besides =

    • [no_tags]

      lazyload fix where two comparisons in the join condition point to the samem column

    • [no_tags]

      added “construct_new” flag to mapper, will use __new__ to create instances instead of __init__ (standard in 0.2)

    • [no_tags]

      added selectresults.py to SVN, missed it last time

    • [no_tags]

      tweak to allow a many-to-many relationship from a table to itself via an association table

    • [no_tags]

      small fix to “translate_row” function used by polymorphic example

    • [no_tags]

      create_engine uses cgi.parse_qsl to read query string (out the window in 0.2)

    • [no_tags]

      tweaks to CAST operator

    • [no_tags]

      fixed function names LOCAL_TIME/LOCAL_TIMESTAMP -> LOCALTIME/LOCALTIMESTAMP

    • [no_tags]

      fixed order of ORDER BY/HAVING in compile

    0.1.6

    Released: Wed Apr 12 2006

    • [no_tags]

      support for MS-SQL added courtesy Rick Morrison, Runar Petursson

    • [no_tags]

      the latest SQLSoup from J. Ellis

    • [no_tags]

      ActiveMapper has preliminary support for inheritance (Jeff Watkins)

    • [no_tags]

      added a “mods” system which allows pluggable modules that modify/augment core functionality, using the function “install_mods(*modnames)”.

    • [no_tags]

      added the first “mod”, SelectResults, which modifies mapper selects to return generators that turn ranges into LIMIT/OFFSET queries (Jonas Borgstr?

    • [no_tags]

      factored out querying capabilities of Mapper into a separate Query object which is Session-centric. this improves the performance of mapper.using(session) and makes other things possible.

    • [no_tags]

      objectstore/Session refactored, the official way to save objects is now via the flush() method. The begin/commit functionality of Session is factored into LegacySession which is still established as the default behavior, until the 0.2 series.

    • [no_tags]

      types system is bound to an engine at query compile time, not schema construction time. this simplifies the types system as well as the ProxyEngine.

    • [no_tags]

      added ‘version_id’ keyword argument to mapper. this keyword should reference a Column object with type Integer, preferably non-nullable, which will be used on the mapped table to track version numbers. this number is incremented on each save operation and is specified in the UPDATE/DELETE conditions so that it factors into the returned row count, which results in a ConcurrencyError if the value received is not the expected count.

    • [no_tags]

      added ‘entity_name’ keyword argument to mapper. a mapper is now associated with a class via the class object as well as an optional entity_name parameter, which is a string defaulting to None. any number of primary mappers can be created for a class, qualified by the entity name. instances of those classes will issue all of their load and save operations through their entity_name-qualified mapper, and maintain separate a identity in the identity map for an otherwise equivalent object.

    • [no_tags]

      overhaul to the attributes system. code has been clarified, and also fixed to support proper polymorphic behavior on object attributes.

    • [no_tags]

      added “for_update” flag to Select objects

    • [no_tags]

      some fixes for backrefs

    • [no_tags]

      fix for postgres1 DateTime type

    • [no_tags]

      documentation pages mostly switched over to Markdown syntax

    Released: Mon Mar 27 2006

    • [no_tags]

      added nest_on argument to objectstore.Session. This is a single SQLEngine or list of engines for which push_session()/pop_session() will be called each time this Session becomes the active session (via objectstore.push_session() or equivalent). This allows a unit of work Session to take advantage of the nested transaction feature without explicitly calling push_session/pop_session on the engine.

    • [no_tags]

      factored apart objectstore/unitofwork to separate “Session scoping” from “uow commit heavy lifting”

    • [no_tags]

      added populate_instance() method to MapperExtension. allows an extension to modify the population of object attributes. this method can call the populate_instance() method on another mapper to proxy the attribute population from one mapper to another; some row translation logic is also built in to help with this.

    • [no_tags]

      fixed Oracle8-compatibility “use_ansi” flag which converts JOINs to comparisons with the = and (+) operators, passes basic unittests

    • tweaks to Oracle LIMIT/OFFSET support

    • [no_tags]

      Oracle reflection uses ALL_** views instead of USER_** to get larger list of stuff to reflect from

    • [no_tags]

      fixes to Oracle foreign key reflection

      References:

    • [no_tags]

      objectstore.commit(obj1, obj2,…) adds an extra step to seek out private relations on properties and delete child objects, even though its not a global commit

    • [no_tags]

      lots and lots of fixes to mappers which use inheritance, strengthened the concept of relations on a mapper being made towards the “local” table for that mapper, not the tables it inherits. allows more complex compositional patterns to work with lazy/eager loading.

    • [no_tags]

      added support for mappers to inherit from others based on the same table, just specify the same table as that of both parent/child mapper.

    • [no_tags]

      some minor speed improvements to the attributes system with regards to instantiating and populating new objects.

    • [no_tags]

      fixed MySQL binary unit test

    • [no_tags]

      INSERTs can receive clause elements as VALUES arguments, not just literal values

    • [no_tags]

      support for calling multi-tokened functions, i.e. schema.mypkg.func()

    • [no_tags]

      added J. Ellis’ SQLSoup module to extensions package

    • [no_tags]

      added “polymorphic” examples illustrating methods to load multiple object types from one mapper, the second of which uses the new populate_instance() method. small improvements to mapper, UNION construct to help the examples along

    • [no_tags]

      improvements/fixes to session.refresh()/session.expire() (which may have been called “invalidate” earlier..)

    • [no_tags]

      added session.expunge() which totally removes an object from the current session

    • [no_tags]

      added *args, **kwargs pass-through to engine.transaction(func) allowing easier creation of transactionalizing decorator functions

    • [no_tags]

      added iterator interface to ResultProxy: “for row in result:…”

    • [no_tags]

      added assertion to tx = session.begin(); tx.rollback(); tx.begin(), i.e. can’t use it after a rollback()

    • [no_tags]

      added date conversion on bind parameter fix to SQLite enabling dates to work with pysqlite1

    • [no_tags]

      improvements to subqueries to more intelligently construct their FROM clauses

      References: #116

    • [no_tags]

      added PickleType to types.

    • [no_tags]

      fixed two bugs with column labels with regards to bind parameters: bind param keynames they are now generated from a column “label” in all relevant cases to take advantage of excess-name-length rules, and checks for a peculiar collision against a column named the same as “tablename_colname” added

    • [no_tags]

      major overhaul to unit of work documentation, other documentation sections.

    • [no_tags]

      fixed attributes bug where if an object is committed, its lazy-loaded list got blown away if it hadn’t been loaded

    • [no_tags]

      added unique_connection() method to engine, connection pool to return a connection that is not part of the thread-local context or any current transaction

    • [no_tags]

      added invalidate() function to pooled connection. will remove the connection from the pool. still need work for engines to auto-reconnect to a stale DB though.

    • [no_tags]

      added distinct() function to column elements so you can do func.count(mycol.distinct())

    • [no_tags]

      added “always_refresh” flag to Mapper, creates a mapper that will always refresh the attributes of objects it gets/selects from the DB, overwriting any changes made.

    0.1.4

    Released: Mon Mar 13 2006

    • [no_tags]

      create_engine() now uses genericized parameters; host/hostname, db/dbname/database, password/passwd, etc. for all engine connections. makes engine URIs much more “universal”

    • [no_tags]

      added support for SELECT statements embedded into a column clause, using the flag “scalar=True”

    • [no_tags]

      another overhaul to EagerLoading when used in conjunction with mappers that inherit; improvements to eager loads figuring out their aliased queries correctly, also relations set up against a mapper with inherited mappers will create joins against the table that is specific to the mapper itself (i.e. and not any tables that are inherited/are further down the inheritance chain), this can be overridden by using custom primary/secondary joins.

    • [no_tags]

      added J.Ellis patch to mapper.py so that selectone() throws an exception if query returns more than one object row, selectfirst() to not throw the exception. also adds selectfirst_by (synonymous with get_by) and selectone_by

    • [no_tags]

      added onupdate parameter to Column, will exec SQL/python upon an update statement.Also adds “for_update=True” to all DefaultGenerator subclasses

    • [no_tags]

      added support for Oracle table reflection contributed by Andrija Zaric; still some bugs to work out regarding composite primary keys/dictionary selection

    • [no_tags]

      checked in an initial Firebird module, awaiting testing.

    • [no_tags]

      added sql.ClauseParameters dictionary object as the result for compiled.get_params(), does late-typeprocessing of bind parameters so that the original values are easier to access

    • [no_tags]

      more docs for indexes, column defaults, connection pooling, engine construction

    • [no_tags]

      overhaul to the construction of the types system. uses a simpler inheritance pattern so that any of the generic types can be easily subclassed, with no need for TypeDecorator.

    • [no_tags]

      added “convert_unicode=False” parameter to SQLEngine, will cause all String types to perform unicode encoding/decoding (makes Strings act like Unicodes)

    • [no_tags]

      added ‘encoding=”utf8”’ parameter to engine. the given encoding will be used for all encode/decode calls within Unicode types as well as Strings when convert_unicode=True.

    • [no_tags]

      improved support for mapping against UNIONs, added polymorph.py example to illustrate multi-class mapping against a UNION

    • [no_tags]

      fix to SQLite LIMIT/OFFSET syntax

    • [no_tags]

      fix to Oracle LIMIT syntax

    • [no_tags]

      Sequences and ColumnDefault objects can do execute()/scalar() standalone

    • SQL functions (i.e. func.foo()) can do execute()/scalar() standalone

    • [no_tags]

      fix to SQL functions so that the ANSI-standard functions, i.e. current_timestamp etc., do not specify parenthesis. all other functions do.

    • [no_tags]

      added settattr_clean and append_clean to SmartProperty, which set attributes without triggering a “dirty” event or any history. used as: myclass.prop1.setattr_clean(myobject, ‘hi’)

    • [no_tags]

      improved support to column defaults when used by mappers; mappers will pull pre-executed defaults from statement’s executed bind parameters (pre-conversion) to populate them into a saved object’s attributes; if any PassiveDefaults have fired off, will instead post-fetch the row from the DB to populate the object.

    • [no_tags]

      added ‘get_session().invalidate(*obj)’ method to objectstore, instances will refresh() themselves upon the next attribute access.

    • [no_tags]

      improvements to SQL func calls including an “engine” keyword argument so they can be execute()d or scalar()ed standalone, also added func accessor to SQLEngine

    • [no_tags]

      fix to MySQL4 custom table engines, i.e. TYPE instead of ENGINE

    • [no_tags]

      slightly enhanced logging, includes timestamps and a somewhat configurable formatting system, in lieu of a full-blown logging system

    • [no_tags]

      improvements to the ActiveMapper class from the TG gang, including many-to-many relationships

    • [no_tags]

      added Double and TinyInt support to mysql

    Released: Thu Mar 02 2006

    • [no_tags]

      completed “post_update” feature, will add a second update statement before inserts and after deletes in order to reconcile a relationship without any dependencies being created; used when persisting two rows that are dependent on each other

    • [no_tags]

      completed mapper.using(session) function, localized per-object Session functionality; objects can be declared and manipulated as local to any user-defined Session

    • [no_tags]

      fix to Oracle “row_number over” clause with multiple tables

    • [no_tags]

      mapper.get() was not selecting multiple-keyed objects if the mapper’s table was a join, such as in an inheritance relationship, this is fixed.

    • [no_tags]

      overhaul to sql/schema packages so that the sql package can run all on its own, producing selects, inserts, etc. without any engine dependencies. builds upon new TableClause/ColumnClause lexical objects. Schema’s Table/Column objects are the “physical” subclasses of them. simplifies schema/sql relationship, extensions (like proxyengine), and speeds overall performance by a large margin. removes the entire getattr() behavior that plagued 0.1.1.

    • [no_tags]

      refactoring of how the mapper “synchronizes” data between two objects into a separate module, works better with properties attached to a mapper that has an additional inheritance relationship to one of the related tables, also the same methodology used to synchronize parent/child objects now used by mapper to synchronize between inherited and inheriting mappers.

    • [no_tags]

      made objectstore “check for out-of-identitymap” more aggressive, will perform the check when object attributes are modified or the object is deleted

    • [no_tags]

      Index object fully implemented, can be constructed standalone, or via “index” and “unique” arguments on Columns.

    • [no_tags]

      added “convert_unicode” flag to SQLEngine, will treat all String/CHAR types as Unicode types, with raw-byte/utf-8 translation on the bind parameter and result set side.

    • [no_tags]

      postgres maintains a list of ANSI functions that must have no parenthesis so function calls with no arguments work consistently

    • [no_tags]

      tables can be created with no engine specified. this will default their engine to a module-scoped “default engine” which is a ProxyEngine. this engine can be connected via the function “global_connect”.

    • [no_tags]

      added “refresh(*obj)” method to objectstore / Session to reload the attributes of any set of objects from the database unconditionally

    0.1.2

    Released: Fri Feb 24 2006

    • [no_tags]

      fixed a recursive call in schema that was somehow running 994 times then returning normally. broke nothing, slowed down everything. thanks to jpellerin for finding this.

    Released: Thu Feb 23 2006

    • [no_tags]

      small fix to Function class so that expressions with a func.foo() use the type of the Function object (i.e. the left side) as the type of the boolean expression, not the other side which is more of a moving target (changeset 1020).

    • [no_tags]

      creating self-referring mappers with backrefs slightly easier (but still not that easy - changeset 1019)

    • [no_tags]

      fixes to one-to-one mappings (changeset 1015)

    • [no_tags]

      psycopg1 date/time issue with None fixed (changeset 1005)

    • [no_tags]

      two issues related to postgres, which doesn’t want to give you the “lastrowid” since oids are deprecated:

    • [no_tags]

      fixed a glitch with engine.execute_compiled where it was making a second ResultProxy that just got thrown away.

    • [no_tags]

      began to implement newer logic in object properties. you can now say myclass.attr.property, which will give you the PropertyLoader corresponding to that attribute, i.e. myclass.mapper.props[‘attr’]

    • [no_tags]

      eager loading has been internally overhauled to use aliases at all times. more complicated chains of eager loads can now be created without any need for explicit “use aliases”-type instructions. EagerLoader code is also much simpler now.

    • [no_tags]

      a new somewhat experimental flag “use_update” added to relations, indicates that this relationship should be handled by a second UPDATE statement, either after a primary INSERT or before a primary DELETE. handles circular row dependencies.

    • [no_tags]

      added exceptions module, all raised exceptions (except for some KeyError/AttributeError exceptions) descend from these classes.

    • [no_tags]

      fix to date types with MySQL, returned timedelta converted to datetime.time

    • [no_tags]

      two-phase objectstore.commit operations (i.e. begin/commit) now return a transactional object (SessionTrans), to more clearly indicate transaction boundaries.

    • [no_tags]

      Index object with create/drop support added to schema

    • [no_tags]

      fix to postgres, where it will explicitly pre-execute a PassiveDefault on a table if it is a primary key column, pursuant to the ongoing “we can’t get inserted rows back from postgres” issue

    • [no_tags]

      change to information_schema query that gets back postgres table defs, now uses explicit JOIN keyword, since one user had faster performance with 8.1

    • [no_tags]

      fix to engine.process_defaults so it works correctly with a table that has different column name/column keys (changeset 982)

    • [no_tags]

      a column can only be attached to one table - this is now asserted

    • [no_tags]

      postgres time types descend from Time type

    • [no_tags]

      fix to alltests so that it runs types test (now named testtypes)

    • [no_tags]

      fix to Join object so that it correctly exports its foreign keys (cs 973)