~ubuntu-branches/debian/sid/sqlalchemy/sid

« back to all changes in this revision

Viewing changes to doc/_sources/changelog/changelog_05.txt

  • Committer: Package Import Robot
  • Author(s): Piotr Ożarowski
  • Date: 2014-06-27 20:17:13 UTC
  • mfrom: (1.4.28)
  • Revision ID: package-import@ubuntu.com-20140627201713-g6p1kq8q1qenztrv
Tags: 0.9.6-1
* New upstream release
* Remove Python 3.X build tag files, thanks to Matthias Urlichs for the
  patch (closes: #747852)
* python-fdb isn't in the Debian archive yet so default dialect for firebird://
  URLs is changed to obsolete kinterbasdb, thanks to Russell Stuart for the
  patch (closes: #752145)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
 
2
 
==============
3
 
0.5 Changelog
4
 
==============
5
 
 
6
 
                
7
 
.. changelog::
8
 
    :version: 0.5.9
9
 
    :released: 
10
 
 
11
 
    .. change::
12
 
        :tags: sql
13
 
        :tickets: 1661
14
 
 
15
 
      Fixed erroneous self_group() call in expression package.
16
 
 
17
 
.. changelog::
18
 
    :version: 0.5.8
19
 
    :released: Sat Jan 16 2010
20
 
 
21
 
    .. change::
22
 
        :tags: sql
23
 
        :tickets: 
24
 
 
25
 
      The copy() method on Column now supports uninitialized,
26
 
      unnamed Column objects. This allows easy creation of
27
 
      declarative helpers which place common columns on multiple
28
 
      subclasses.
29
 
 
30
 
    .. change::
31
 
        :tags: sql
32
 
        :tickets: 
33
 
 
34
 
      Default generators like Sequence() translate correctly
35
 
      across a copy() operation.
36
 
 
37
 
    .. change::
38
 
        :tags: sql
39
 
        :tickets: 
40
 
 
41
 
      Sequence() and other DefaultGenerator objects are accepted
42
 
      as the value for the "default" and "onupdate" keyword
43
 
      arguments of Column, in addition to being accepted
44
 
      positionally.
45
 
 
46
 
    .. change::
47
 
        :tags: sql
48
 
        :tickets: 1568, 1617
49
 
 
50
 
      Fixed a column arithmetic bug that affected column
51
 
      correspondence for cloned selectables which contain
52
 
      free-standing column expressions.   This bug is
53
 
      generally only noticeable when exercising newer
54
 
      ORM behavior only availble in 0.6 via,
55
 
      but is more correct at the SQL expression level
56
 
      as well.
57
 
 
58
 
    .. change::
59
 
        :tags: postgresql
60
 
        :tickets: 1647
61
 
 
62
 
      The extract() function, which was slightly improved in
63
 
      0.5.7, needed a lot more work to generate the correct
64
 
      typecast (the typecasts appear to be necessary in PG's
65
 
      EXTRACT quite a lot of the time).  The typecast is
66
 
      now generated using a rule dictionary based
67
 
      on PG's documentation for date/time/interval arithmetic.
68
 
      It also accepts text() constructs again, which was broken
69
 
      in 0.5.7.
70
 
 
71
 
    .. change::
72
 
        :tags: firebird
73
 
        :tickets: 1646
74
 
 
75
 
      Recognize more errors as disconnections.
76
 
 
77
 
.. changelog::
78
 
    :version: 0.5.7
79
 
    :released: Sat Dec 26 2009
80
 
 
81
 
    .. change::
82
 
        :tags: orm
83
 
        :tickets: 1543
84
 
 
85
 
      contains_eager() now works with the automatically
86
 
      generated subquery that results when you say
87
 
      "query(Parent).join(Parent.somejoinedsubclass)", i.e.
88
 
      when Parent joins to a joined-table-inheritance subclass.
89
 
      Previously contains_eager() would erroneously add the
90
 
      subclass table to the query separately producing a
91
 
      cartesian product.  An example is in the ticket
92
 
      description.
93
 
 
94
 
    .. change::
95
 
        :tags: orm
96
 
        :tickets: 1553
97
 
 
98
 
      query.options() now only propagate to loaded objects
99
 
      for potential further sub-loads only for options where
100
 
      such behavior is relevant, keeping
101
 
      various unserializable options like those generated
102
 
      by contains_eager() out of individual instance states.
103
 
 
104
 
    .. change::
105
 
        :tags: orm
106
 
        :tickets: 1054
107
 
 
108
 
      Session.execute() now locates table- and
109
 
      mapper-specific binds based on a passed
110
 
      in expression which is an insert()/update()/delete()
111
 
      construct.
112
 
 
113
 
    .. change::
114
 
        :tags: orm
115
 
        :tickets: 
116
 
 
117
 
      Session.merge() now properly overwrites a many-to-one or
118
 
      uselist=False attribute to None if the attribute
119
 
      is also None in the given object to be merged.
120
 
 
121
 
    .. change::
122
 
        :tags: orm
123
 
        :tickets: 1618
124
 
 
125
 
      Fixed a needless select which would occur when merging
126
 
      transient objects that contained a null primary key
127
 
      identifier.
128
 
 
129
 
    .. change::
130
 
        :tags: orm
131
 
        :tickets: 1585
132
 
 
133
 
      Mutable collection passed to the "extension" attribute
134
 
      of relation(), column_property() etc. will not be mutated
135
 
      or shared among multiple instrumentation calls, preventing
136
 
      duplicate extensions, such as backref populators,
137
 
      from being inserted into the list.
138
 
 
139
 
    .. change::
140
 
        :tags: orm
141
 
        :tickets: 1504
142
 
 
143
 
      Fixed the call to get_committed_value() on CompositeProperty.
144
 
 
145
 
    .. change::
146
 
        :tags: orm
147
 
        :tickets: 1602
148
 
 
149
 
      Fixed bug where Query would crash if a join() with no clear
150
 
      "left" side were called when a non-mapped column entity
151
 
      appeared in the columns list.
152
 
 
153
 
    .. change::
154
 
        :tags: orm
155
 
        :tickets: 1616, 1480
156
 
 
157
 
      Fixed bug whereby composite columns wouldn't load properly
158
 
      when configured on a joined-table subclass, introduced in
159
 
      version 0.5.6 as a result of the fix for. thx to Scott Torborg.
160
 
 
161
 
    .. change::
162
 
        :tags: orm
163
 
        :tickets: 1556
164
 
 
165
 
      The "use get" behavior of many-to-one relations, i.e. that a
166
 
      lazy load will fallback to the possibly cached query.get()
167
 
      value, now works across join conditions where the two compared
168
 
      types are not exactly the same class, but share the same
169
 
      "affinity" - i.e. Integer and SmallInteger.  Also allows
170
 
      combinations of reflected and non-reflected types to work
171
 
      with 0.5 style type reflection, such as PGText/Text (note 0.6
172
 
      reflects types as their generic versions).
173
 
 
174
 
    .. change::
175
 
        :tags: orm
176
 
        :tickets: 1436
177
 
 
178
 
      Fixed bug in query.update() when passing Cls.attribute
179
 
      as keys in the value dict and using synchronize_session='expire'
180
 
      ('fetch' in 0.6).
181
 
 
182
 
    .. change::
183
 
        :tags: sql
184
 
        :tickets: 1603
185
 
 
186
 
      Fixed bug in two-phase transaction whereby commit() method
187
 
      didn't set the full state which allows subsequent close()
188
 
      call to succeed.
189
 
 
190
 
    .. change::
191
 
        :tags: sql
192
 
        :tickets: 
193
 
 
194
 
      Fixed the "numeric" paramstyle, which apparently is the
195
 
      default paramstyle used by Informixdb.
196
 
 
197
 
    .. change::
198
 
        :tags: sql
199
 
        :tickets: 1574
200
 
 
201
 
      Repeat expressions in the columns clause of a select
202
 
      are deduped based on the identity of each clause element,
203
 
      not the actual string.  This allows positional
204
 
      elements to render correctly even if they all render
205
 
      identically, such as "qmark" style bind parameters.
206
 
 
207
 
    .. change::
208
 
        :tags: sql
209
 
        :tickets: 1632
210
 
 
211
 
      The cursor associated with connection pool connections
212
 
      (i.e. _CursorFairy) now proxies `__iter__()` to the
213
 
      underlying cursor correctly.
214
 
 
215
 
    .. change::
216
 
        :tags: sql
217
 
        :tickets: 1556
218
 
 
219
 
      types now support an "affinity comparison" operation, i.e.
220
 
      that an Integer/SmallInteger are "compatible", or
221
 
      a Text/String, PickleType/Binary, etc.  Part of.
222
 
 
223
 
    .. change::
224
 
        :tags: sql
225
 
        :tickets: 1641
226
 
 
227
 
      Fixed bug preventing alias() of an alias() from being
228
 
      cloned or adapted (occurs frequently in ORM operations).
229
 
 
230
 
    .. change::
231
 
        :tags: sqlite
232
 
        :tickets: 1439
233
 
 
234
 
      sqlite dialect properly generates CREATE INDEX for a table
235
 
      that is in an alternate schema.
236
 
 
237
 
    .. change::
238
 
        :tags: postgresql
239
 
        :tickets: 1085
240
 
 
241
 
      Added support for reflecting the DOUBLE PRECISION type,
242
 
      via a new postgres.PGDoublePrecision object.
243
 
      This is postgresql.DOUBLE_PRECISION in 0.6.
244
 
 
245
 
    .. change::
246
 
        :tags: postgresql
247
 
        :tickets: 460
248
 
 
249
 
      Added support for reflecting the INTERVAL YEAR TO MONTH
250
 
      and INTERVAL DAY TO SECOND syntaxes of the INTERVAL
251
 
      type.
252
 
 
253
 
    .. change::
254
 
        :tags: postgresql
255
 
        :tickets: 1576
256
 
 
257
 
      Corrected the "has_sequence" query to take current schema,
258
 
      or explicit sequence-stated schema, into account.
259
 
 
260
 
    .. change::
261
 
        :tags: postgresql
262
 
        :tickets: 1611
263
 
 
264
 
      Fixed the behavior of extract() to apply operator
265
 
      precedence rules to the "::" operator when applying
266
 
      the "timestamp" cast - ensures proper parenthesization.
267
 
 
268
 
    .. change::
269
 
        :tags: mssql
270
 
        :tickets: 1561
271
 
 
272
 
      Changed the name of TrustedConnection to
273
 
      Trusted_Connection when constructing pyodbc connect
274
 
      arguments
275
 
 
276
 
    .. change::
277
 
        :tags: oracle
278
 
        :tickets: 1637
279
 
 
280
 
      The "table_names" dialect function, used by MetaData
281
 
      .reflect(), omits "index overflow tables", a system
282
 
      table generated by Oracle when "index only tables"
283
 
      with overflow are used.  These tables aren't accessible
284
 
      via SQL and can't be reflected.
285
 
 
286
 
    .. change::
287
 
        :tags: ext
288
 
        :tickets: 1570, 1523
289
 
 
290
 
      A column can be added to a joined-table declarative
291
 
      superclass after the class has been constructed
292
 
      (i.e. via class-level attribute assignment), and
293
 
      the column will be propagated down to
294
 
      subclasses.  This is the reverse
295
 
      situation as that of, fixed in 0.5.6.
296
 
 
297
 
    .. change::
298
 
        :tags: ext
299
 
        :tickets: 1491
300
 
 
301
 
      Fixed a slight inaccuracy in the sharding example.
302
 
      Comparing equivalence of columns in the ORM is best
303
 
      accomplished using col1.shares_lineage(col2).
304
 
 
305
 
    .. change::
306
 
        :tags: ext
307
 
        :tickets: 1606
308
 
 
309
 
      Removed unused `load()` method from ShardedQuery.
310
 
 
311
 
.. changelog::
312
 
    :version: 0.5.6
313
 
    :released: Sat Sep 12 2009
314
 
 
315
 
    .. change::
316
 
        :tags: orm
317
 
        :tickets: 1300
318
 
 
319
 
      Fixed bug whereby inheritance discriminator part of a
320
 
      composite primary key would fail on updates.
321
 
      Continuation of.
322
 
 
323
 
    .. change::
324
 
        :tags: orm
325
 
        :tickets: 1507
326
 
 
327
 
      Fixed bug which disallowed one side of a many-to-many
328
 
      bidirectional reference to declare itself as "viewonly"
329
 
 
330
 
    .. change::
331
 
        :tags: orm
332
 
        :tickets: 1526
333
 
 
334
 
      Added an assertion that prevents a @validates function
335
 
      or other AttributeExtension from loading an unloaded
336
 
      collection such that internal state may be corrupted.
337
 
 
338
 
    .. change::
339
 
        :tags: orm
340
 
        :tickets: 1519
341
 
 
342
 
      Fixed bug which prevented two entities from mutually
343
 
      replacing each other's primary key values within a single
344
 
      flush() for some orderings of operations.
345
 
 
346
 
    .. change::
347
 
        :tags: orm
348
 
        :tickets: 1485
349
 
 
350
 
      Fixed an obscure issue whereby a joined-table subclass
351
 
      with a self-referential eager load on the base class
352
 
      would populate the related object's "subclass" table with
353
 
      data from the "subclass" table of the parent.
354
 
 
355
 
    .. change::
356
 
        :tags: orm
357
 
        :tickets: 1477
358
 
 
359
 
      relations() now have greater ability to be "overridden",
360
 
      meaning a subclass that explicitly specifies a relation()
361
 
      overriding that of the parent class will be honored
362
 
      during a flush.  This is currently to support
363
 
      many-to-many relations from concrete inheritance setups.
364
 
      Outside of that use case, YMMV.
365
 
 
366
 
    .. change::
367
 
        :tags: orm
368
 
        :tickets: 1483
369
 
 
370
 
      Squeezed a few more unnecessary "lazy loads" out of
371
 
      relation().  When a collection is mutated, many-to-one
372
 
      backrefs on the other side will not fire off to load
373
 
      the "old" value, unless "single_parent=True" is set.
374
 
      A direct assignment of a many-to-one still loads
375
 
      the "old" value in order to update backref collections
376
 
      on that value, which may be present in the session
377
 
      already, thus maintaining the 0.5 behavioral contract.
378
 
 
379
 
    .. change::
380
 
        :tags: orm
381
 
        :tickets: 1480
382
 
 
383
 
      Fixed bug whereby a load/refresh of joined table
384
 
      inheritance attributes which were based on
385
 
      column_property() or similar would fail to evaluate.
386
 
 
387
 
    .. change::
388
 
        :tags: orm
389
 
        :tickets: 1488
390
 
 
391
 
      Improved support for MapperProperty objects overriding
392
 
      that of an inherited mapper for non-concrete
393
 
      inheritance setups - attribute extensions won't randomly
394
 
      collide with each other.
395
 
 
396
 
    .. change::
397
 
        :tags: orm
398
 
        :tickets: 1487
399
 
 
400
 
      UPDATE and DELETE do not support ORDER BY, LIMIT, OFFSET,
401
 
      etc. in standard SQL.  Query.update() and Query.delete()
402
 
      now raise an exception if any of limit(), offset(),
403
 
      order_by(), group_by(), or distinct() have been
404
 
      called.
405
 
 
406
 
    .. change::
407
 
        :tags: orm
408
 
        :tickets: 
409
 
 
410
 
      Added AttributeExtension to sqlalchemy.orm.__all__
411
 
 
412
 
    .. change::
413
 
        :tags: orm
414
 
        :tickets: 1476
415
 
 
416
 
      Improved error message when query() is called with
417
 
      a non-SQL /entity expression.
418
 
 
419
 
    .. change::
420
 
        :tags: orm
421
 
        :tickets: 1440
422
 
 
423
 
      Using False or 0 as a polymorphic discriminator now
424
 
      works on the base class as well as a subclass.
425
 
 
426
 
    .. change::
427
 
        :tags: orm
428
 
        :tickets: 1424
429
 
 
430
 
      Added enable_assertions(False) to Query which disables
431
 
      the usual assertions for expected state - used
432
 
      by Query subclasses to engineer custom state..  See
433
 
      http://www.sqlalchemy.org/trac/wiki/UsageRecipes/PreFilteredQuery
434
 
      for an example.
435
 
 
436
 
    .. change::
437
 
        :tags: orm
438
 
        :tickets: 1501
439
 
 
440
 
      Fixed recursion issue which occured if a mapped object's
441
 
      `__len__()` or `__nonzero__()` method resulted in state
442
 
      changes.
443
 
 
444
 
    .. change::
445
 
        :tags: orm
446
 
        :tickets: 1506
447
 
 
448
 
      Fixed incorrect exception raise in
449
 
      Weak/StrongIdentityMap.add()
450
 
 
451
 
    .. change::
452
 
        :tags: orm
453
 
        :tickets: 1522
454
 
 
455
 
      Fixed the error message for "could not find a FROM clause"
456
 
      in query.join() which would fail to issue correctly
457
 
      if the query was against a pure SQL construct.
458
 
 
459
 
    .. change::
460
 
        :tags: orm
461
 
        :tickets: 1486
462
 
 
463
 
      Fixed a somewhat hypothetical issue which would result
464
 
      in the wrong primary key being calculated for a mapper
465
 
      using the old polymorphic_union function - but this
466
 
      is old stuff.
467
 
 
468
 
    .. change::
469
 
        :tags: sql
470
 
        :tickets: 1373
471
 
 
472
 
      Fixed column.copy() to copy defaults and onupdates.
473
 
 
474
 
    .. change::
475
 
        :tags: sql
476
 
        :tickets: 
477
 
 
478
 
      Fixed a bug in extract() introduced in 0.5.4 whereby
479
 
      the string "field" argument was getting treated as a
480
 
      ClauseElement, causing various errors within more
481
 
      complex SQL transformations.
482
 
 
483
 
    .. change::
484
 
        :tags: sql
485
 
        :tickets: 1420
486
 
 
487
 
      Unary expressions such as DISTINCT propagate their
488
 
      type handling to result sets, allowing conversions like
489
 
      unicode and such to take place.
490
 
 
491
 
    .. change::
492
 
        :tags: sql
493
 
        :tickets: 1482
494
 
 
495
 
      Fixed bug in Table and Column whereby passing empty
496
 
      dict for "info" argument would raise an exception.
497
 
 
498
 
    .. change::
499
 
        :tags: oracle
500
 
        :tickets: 1309
501
 
 
502
 
      Backported 0.6 fix for Oracle alias names not getting
503
 
      truncated.
504
 
 
505
 
    .. change::
506
 
        :tags: ext
507
 
        :tickets: 1446
508
 
 
509
 
      The collection proxies produced by associationproxy are now
510
 
      pickleable.  A user-defined proxy_factory however
511
 
      is still not pickleable unless it defines __getstate__
512
 
      and __setstate__.
513
 
 
514
 
    .. change::
515
 
        :tags: ext
516
 
        :tickets: 1468
517
 
 
518
 
      Declarative will raise an informative exception if
519
 
      __table_args__ is passed as a tuple with no dict argument.
520
 
      Improved documentation.
521
 
 
522
 
    .. change::
523
 
        :tags: ext
524
 
        :tickets: 1527
525
 
 
526
 
      Table objects declared in the MetaData can now be used
527
 
      in string expressions sent to primaryjoin/secondaryjoin/
528
 
      secondary - the name is pulled from the MetaData of the
529
 
      declarative base.
530
 
 
531
 
    .. change::
532
 
        :tags: ext
533
 
        :tickets: 1523
534
 
 
535
 
      A column can be added to a joined-table subclass after
536
 
      the class has been constructed (i.e. via class-level
537
 
      attribute assignment).  The column is added to the underlying
538
 
      Table as always, but now the mapper will rebuild its
539
 
      "join" to include the new column, instead of raising
540
 
      an error about "no such column, use column_property()
541
 
      instead".
542
 
 
543
 
    .. change::
544
 
        :tags: test
545
 
        :tickets: 
546
 
 
547
 
      Added examples into the test suite so they get exercised
548
 
      regularly and cleaned up a couple deprecation warnings.
549
 
 
550
 
.. changelog::
551
 
    :version: 0.5.5
552
 
    :released: Mon Jul 13 2009
553
 
 
554
 
    .. change::
555
 
        :tags: general
556
 
        :tickets: 970
557
 
 
558
 
      unit tests have been migrated from unittest to nose.  See
559
 
      README.unittests for information on how to run the tests.
560
 
 
561
 
    .. change::
562
 
        :tags: orm
563
 
        :tickets: 
564
 
 
565
 
      The "foreign_keys" argument of relation() will now propagate
566
 
      automatically to the backref in the same way that primaryjoin
567
 
      and secondaryjoin do.  For the extremely rare use case where
568
 
      the backref of a relation() has intentionally different
569
 
      "foreign_keys" configured, both sides now need to be
570
 
      configured explicity (if they do in fact require this setting,
571
 
      see the next note...).
572
 
 
573
 
    .. change::
574
 
        :tags: orm
575
 
        :tickets: 
576
 
 
577
 
      ...the only known (and really, really rare) use case where a
578
 
      different foreign_keys setting was used on the
579
 
      forwards/backwards side, a composite foreign key that
580
 
      partially points to its own columns, has been enhanced such
581
 
      that the fk->itself aspect of the relation won't be used to
582
 
      determine relation direction.
583
 
 
584
 
    .. change::
585
 
        :tags: orm
586
 
        :tickets: 
587
 
 
588
 
      Session.mapper is now *deprecated*.
589
 
      
590
 
      Call session.add() if you'd like a free-standing object to be
591
 
      part of your session.  Otherwise, a DIY version of
592
 
      Session.mapper is now documented at
593
 
      http://www.sqlalchemy.org/trac/wiki/UsageRecipes/SessionAwareMapper
594
 
      The method will remain deprecated throughout 0.6.
595
 
 
596
 
    .. change::
597
 
        :tags: orm
598
 
        :tickets: 1431
599
 
 
600
 
      Fixed Query being able to join() from individual columns of a
601
 
      joined-table subclass entity, i.e.  query(SubClass.foo,
602
 
      SubcClass.bar).join(<anything>).  In most cases, an error
603
 
      "Could not find a FROM clause to join from" would be
604
 
      raised. In a few others, the result would be returned in terms
605
 
      of the base class rather than the subclass - so applications
606
 
      which relied on this erroneous result need to be
607
 
      adjusted.
608
 
 
609
 
    .. change::
610
 
        :tags: orm
611
 
        :tickets: 1461
612
 
 
613
 
      Fixed a bug involving contains_eager(), which would apply
614
 
      itself to a secondary (i.e. lazy) load in a particular rare
615
 
      case, producing cartesian products.  improved the targeting of
616
 
      query.options() on secondary loads overall.
617
 
 
618
 
    .. change::
619
 
        :tags: orm
620
 
        :tickets: 
621
 
 
622
 
      Fixed bug introduced in 0.5.4 whereby Composite types fail
623
 
      when default-holding columns are flushed.
624
 
 
625
 
    .. change::
626
 
        :tags: orm
627
 
        :tickets: 1426
628
 
 
629
 
      Fixed another 0.5.4 bug whereby mutable attributes
630
 
      (i.e. PickleType) wouldn't be deserialized correctly when the
631
 
      whole object was serialized.
632
 
 
633
 
    .. change::
634
 
        :tags: orm
635
 
        :tickets: 
636
 
 
637
 
      Fixed bug whereby session.is_modified() would raise an
638
 
      exception if any synonyms were in use.
639
 
 
640
 
    .. change::
641
 
        :tags: orm
642
 
        :tickets: 
643
 
 
644
 
      Fixed potential memory leak whereby previously pickled objects
645
 
      placed back in a session would not be fully garbage collected
646
 
      unless the Session were explicitly closed out.
647
 
 
648
 
    .. change::
649
 
        :tags: orm
650
 
        :tickets: 
651
 
 
652
 
      Fixed bug whereby list-based attributes, like pickletype and
653
 
      PGArray, failed to be merged() properly.
654
 
 
655
 
    .. change::
656
 
        :tags: orm
657
 
        :tickets: 
658
 
 
659
 
      Repaired non-working attributes.set_committed_value function.
660
 
 
661
 
    .. change::
662
 
        :tags: orm
663
 
        :tickets: 
664
 
 
665
 
      Trimmed the pickle format for InstanceState which should
666
 
      further reduce the memory footprint of pickled instances.  The
667
 
      format should be backwards compatible with that of 0.5.4 and
668
 
      previous.
669
 
 
670
 
    .. change::
671
 
        :tags: orm
672
 
        :tickets: 1463
673
 
 
674
 
      sqlalchemy.orm.join and sqlalchemy.orm.outerjoin are now
675
 
      added to __all__ in sqlalchemy.orm.*.
676
 
 
677
 
    .. change::
678
 
        :tags: orm
679
 
        :tickets: 1458
680
 
 
681
 
      Fixed bug where Query exception raise would fail when
682
 
      a too-short composite primary key value were passed to
683
 
      get().
684
 
 
685
 
    .. change::
686
 
        :tags: sql
687
 
        :tickets: 
688
 
 
689
 
      Removed an obscure feature of execute() (including connection,
690
 
      engine, Session) whereby a bindparam() construct can be sent
691
 
      as a key to the params dictionary.  This usage is undocumented
692
 
      and is at the core of an issue whereby the bindparam() object
693
 
      created implicitly by a text() construct may have the same
694
 
      hash value as a string placed in the params dictionary and may
695
 
      result in an inappropriate match when computing the final bind
696
 
      parameters.  Internal checks for this condition would add
697
 
      significant latency to the critical task of parameter
698
 
      rendering, so the behavior is removed.  This is a backwards
699
 
      incompatible change for any application that may have been
700
 
      using this feature, however the feature has never been
701
 
      documented.
702
 
 
703
 
    .. change::
704
 
        :tags: engine/pool
705
 
        :tickets: 
706
 
 
707
 
      Implemented recreate() for StaticPool.
708
 
 
709
 
.. changelog::
710
 
    :version: 0.5.4p2
711
 
    :released: Tue May 26 2009
712
 
 
713
 
    .. change::
714
 
        :tags: sql
715
 
        :tickets: 
716
 
 
717
 
      Repaired the printing of SQL exceptions which are not
718
 
      based on parameters or are not executemany() style.
719
 
 
720
 
    .. change::
721
 
        :tags: postgresql
722
 
        :tickets: 
723
 
 
724
 
      Deprecated the hardcoded TIMESTAMP function, which when
725
 
      used as func.TIMESTAMP(value) would render "TIMESTAMP value".
726
 
      This breaks on some platforms as PostgreSQL doesn't allow
727
 
      bind parameters to be used in this context.  The hard-coded
728
 
      uppercase is also inappropriate and there's lots of other
729
 
      PG casts that we'd need to support.  So instead, use
730
 
      text constructs i.e. select(["timestamp '12/05/09'"]).
731
 
 
732
 
.. changelog::
733
 
    :version: 0.5.4p1
734
 
    :released: Mon May 18 2009
735
 
 
736
 
    .. change::
737
 
        :tags: orm
738
 
        :tickets: 
739
 
 
740
 
      Fixed an attribute error introduced in 0.5.4 which would
741
 
      occur when merge() was used with an incomplete object.
742
 
 
743
 
.. changelog::
744
 
    :version: 0.5.4
745
 
    :released: Sun May 17 2009
746
 
 
747
 
    .. change::
748
 
        :tags: orm
749
 
        :tickets: 1398
750
 
 
751
 
      Significant performance enhancements regarding Sessions/flush()
752
 
      in conjunction with large mapper graphs, large numbers of
753
 
      objects:
754
 
      
755
 
      - Removed all* O(N) scanning behavior from the flush() process,
756
 
        i.e. operations that were scanning the full session,
757
 
        including an extremely expensive one that was erroneously
758
 
        assuming primary key values were changing when this
759
 
        was not the case.
760
 
      
761
 
        * one edge case remains which may invoke a full scan,
762
 
          if an existing primary key attribute is modified
763
 
          to a new value.
764
 
      
765
 
      - The Session's "weak referencing" behavior is now *full* -
766
 
        no strong references whatsoever are made to a mapped object
767
 
        or related items/collections in its __dict__.  Backrefs and
768
 
        other cycles in objects no longer affect the Session's ability
769
 
        to lose all references to unmodified objects.  Objects with
770
 
        pending changes still are maintained strongly until flush.
771
 
       
772
 
      
773
 
        The implementation also improves performance by moving
774
 
        the "resurrection" process of garbage collected items
775
 
        to only be relevant for mappings that map "mutable"
776
 
        attributes (i.e. PickleType, composite attrs).  This removes
777
 
        overhead from the gc process and simplifies internal
778
 
        behavior.
779
 
      
780
 
        If a "mutable" attribute change is the sole change on an object
781
 
        which is then dereferenced, the mapper will not have access to
782
 
        other attribute state when the UPDATE is issued.  This may present
783
 
        itself differently to some MapperExtensions.
784
 
      
785
 
        The change also affects the internal attribute API, but not
786
 
        the AttributeExtension interface nor any of the publically
787
 
        documented attribute functions.
788
 
      
789
 
      - The unit of work no longer genererates a graph of "dependency"
790
 
        processors for the full graph of mappers during flush(), instead
791
 
        creating such processors only for those mappers which represent
792
 
        objects with pending changes.  This saves a tremendous number
793
 
        of method calls in the context of a large interconnected
794
 
        graph of mappers.
795
 
      
796
 
      - Cached a wasteful "table sort" operation that previously
797
 
        occured multiple times per flush, also removing significant
798
 
        method call count from flush().
799
 
      
800
 
      - Other redundant behaviors have been simplified in
801
 
        mapper._save_obj().
802
 
 
803
 
    .. change::
804
 
        :tags: orm
805
 
        :tickets: 
806
 
 
807
 
      Modified query_cls on DynamicAttributeImpl to accept a full
808
 
      mixin version of the AppenderQuery, which allows subclassing
809
 
      the AppenderMixin.
810
 
 
811
 
    .. change::
812
 
        :tags: orm
813
 
        :tickets: 1300
814
 
 
815
 
      The "polymorphic discriminator" column may be part of a
816
 
      primary key, and it will be populated with the correct
817
 
      discriminator value.
818
 
 
819
 
    .. change::
820
 
        :tags: orm
821
 
        :tickets: 
822
 
 
823
 
      Fixed the evaluator not being able to evaluate IS NULL clauses.
824
 
 
825
 
    .. change::
826
 
        :tags: orm
827
 
        :tickets: 1352
828
 
 
829
 
      Fixed the "set collection" function on "dynamic" relations to
830
 
      initiate events correctly.  Previously a collection could only
831
 
      be assigned to a pending parent instance, otherwise modified
832
 
      events would not be fired correctly.  Set collection is now
833
 
      compatible with merge(), fixes.
834
 
 
835
 
    .. change::
836
 
        :tags: orm
837
 
        :tickets: 
838
 
 
839
 
      Allowed pickling of PropertyOption objects constructed with
840
 
      instrumented descriptors; previously, pickle errors would occur
841
 
      when pickling an object which was loaded with a descriptor-based
842
 
      option, such as query.options(eagerload(MyClass.foo)).
843
 
 
844
 
    .. change::
845
 
        :tags: orm
846
 
        :tickets: 1357
847
 
 
848
 
      Lazy loader will not use get() if the "lazy load" SQL clause
849
 
      matches the clause used by get(), but contains some parameters
850
 
      hardcoded.  Previously the lazy strategy would fail with the
851
 
      get().  Ideally get() would be used with the hardcoded
852
 
      parameters but this would require further development.
853
 
 
854
 
    .. change::
855
 
        :tags: orm
856
 
        :tickets: 1391
857
 
 
858
 
      MapperOptions and other state associated with query.options()
859
 
      is no longer bundled within callables associated with each
860
 
      lazy/deferred-loading attribute during a load.
861
 
      The options are now associated with the instance's
862
 
      state object just once when it's populated.  This removes
863
 
      the need in most cases for per-instance/attribute loader
864
 
      objects, improving load speed and memory overhead for
865
 
      individual instances.
866
 
 
867
 
    .. change::
868
 
        :tags: orm
869
 
        :tickets: 1360
870
 
 
871
 
      Fixed another location where autoflush was interfering
872
 
      with session.merge().  autoflush is disabled completely
873
 
      for the duration of merge() now.
874
 
 
875
 
    .. change::
876
 
        :tags: orm
877
 
        :tickets: 1406
878
 
 
879
 
      Fixed bug which prevented "mutable primary key" dependency
880
 
      logic from functioning properly on a one-to-one
881
 
      relation().
882
 
 
883
 
    .. change::
884
 
        :tags: orm
885
 
        :tickets: 
886
 
 
887
 
      Fixed bug in relation(), introduced in 0.5.3,
888
 
      whereby a self referential relation
889
 
      from a base class to a joined-table subclass would
890
 
      not configure correctly.
891
 
 
892
 
    .. change::
893
 
        :tags: orm
894
 
        :tickets: 
895
 
 
896
 
      Fixed obscure mapper compilation issue when inheriting
897
 
      mappers are used which would result in un-initialized
898
 
      attributes.
899
 
 
900
 
    .. change::
901
 
        :tags: orm
902
 
        :tickets: 
903
 
 
904
 
      Fixed documentation for session weak_identity_map -
905
 
      the default value is True, indicating a weak
906
 
      referencing map in use.
907
 
 
908
 
    .. change::
909
 
        :tags: orm
910
 
        :tickets: 1376
911
 
 
912
 
      Fixed a unit of work issue whereby the foreign
913
 
      key attribute on an item contained within a collection
914
 
      owned by an object being deleted would not be set to
915
 
      None if the relation() was self-referential.
916
 
 
917
 
    .. change::
918
 
        :tags: orm
919
 
        :tickets: 1378
920
 
 
921
 
      Fixed Query.update() and Query.delete() failures with eagerloaded
922
 
      relations.
923
 
 
924
 
    .. change::
925
 
        :tags: orm
926
 
        :tickets: 
927
 
 
928
 
      It is now an error to specify both columns of a binary primaryjoin
929
 
      condition in the foreign_keys or remote_side collection.  Whereas
930
 
      previously it was just nonsensical, but would succeed in a
931
 
      non-deterministic way.
932
 
 
933
 
    .. change::
934
 
        :tags: ticket: 594, 1341, schema
935
 
        :tickets: 
936
 
 
937
 
      Added a quote_schema() method to the IdentifierPreparer class
938
 
      so that dialects can override how schemas get handled. This
939
 
      enables the MSSQL dialect to treat schemas as multipart
940
 
      identifiers, such as 'database.owner'.
941
 
 
942
 
    .. change::
943
 
        :tags: sql
944
 
        :tickets: 
945
 
 
946
 
      Back-ported the "compiler" extension from SQLA 0.6.  This
947
 
      is a standardized interface which allows the creation of custom
948
 
      ClauseElement subclasses and compilers.  In particular it's
949
 
      handy as an alternative to text() when you'd like to
950
 
      build a construct that has database-specific compilations.
951
 
      See the extension docs for details.
952
 
 
953
 
    .. change::
954
 
        :tags: sql
955
 
        :tickets: 1413
956
 
 
957
 
      Exception messages are truncated when the list of bound
958
 
      parameters is larger than 10, preventing enormous
959
 
      multi-page exceptions from filling up screens and logfiles
960
 
      for large executemany() statements.
961
 
 
962
 
    .. change::
963
 
        :tags: sql
964
 
        :tickets: 
965
 
 
966
 
      ``sqlalchemy.extract()`` is now dialect sensitive and can
967
 
      extract components of timestamps idiomatically across the
968
 
      supported databases, including SQLite.
969
 
 
970
 
    .. change::
971
 
        :tags: sql
972
 
        :tickets: 1353
973
 
 
974
 
      Fixed __repr__() and other _get_colspec() methods on
975
 
      ForeignKey constructed from __clause_element__() style
976
 
      construct (i.e. declarative columns).
977
 
 
978
 
    .. change::
979
 
        :tags: mysql
980
 
        :tickets: 1405
981
 
 
982
 
      Reflecting a FOREIGN KEY construct will take into account
983
 
      a dotted schema.tablename combination, if the foreign key
984
 
      references a table in a remote schema.
985
 
 
986
 
    .. change::
987
 
        :tags: mssql
988
 
        :tickets: 
989
 
 
990
 
      Modified how savepoint logic works to prevent it from
991
 
      stepping on non-savepoint oriented routines. Savepoint
992
 
      support is still very experimental.
993
 
 
994
 
    .. change::
995
 
        :tags: mssql
996
 
        :tickets: 1310
997
 
 
998
 
      Added in reserved words for MSSQL that covers version 2008
999
 
      and all prior versions.
1000
 
 
1001
 
    .. change::
1002
 
        :tags: mssql
1003
 
        :tickets: 1343
1004
 
 
1005
 
      Corrected problem with information schema not working with a
1006
 
      binary collation based database. Cleaned up information schema
1007
 
      since it is only used by mssql now.
1008
 
 
1009
 
    .. change::
1010
 
        :tags: sqlite
1011
 
        :tickets: 1402
1012
 
 
1013
 
      Corrected the SLBoolean type so that it properly treats only 1
1014
 
      as True.
1015
 
 
1016
 
    .. change::
1017
 
        :tags: sqlite
1018
 
        :tickets: 1273
1019
 
 
1020
 
      Corrected the float type so that it correctly maps to a
1021
 
      SLFloat type when being reflected.
1022
 
 
1023
 
    .. change::
1024
 
        :tags: extensions
1025
 
        :tickets: 1379
1026
 
 
1027
 
      Fixed adding of deferred or other column properties to a
1028
 
      declarative class.
1029
 
 
1030
 
.. changelog::
1031
 
    :version: 0.5.3
1032
 
    :released: Tue Mar 24 2009
1033
 
 
1034
 
    .. change::
1035
 
        :tags: orm
1036
 
        :tickets: 1315
1037
 
 
1038
 
      The "objects" argument to session.flush() is deprecated.
1039
 
      State which represents the linkage between a parent and
1040
 
      child object does not support "flushed" status on
1041
 
      one side of the link and not the other, so supporting
1042
 
      this operation leads to misleading results.
1043
 
 
1044
 
    .. change::
1045
 
        :tags: orm
1046
 
        :tickets: 
1047
 
 
1048
 
      Query now implements __clause_element__() which produces
1049
 
      its selectable, which means a Query instance can be accepted
1050
 
      in many SQL expressions, including col.in_(query),
1051
 
      union(query1, query2), select([foo]).select_from(query),
1052
 
      etc.
1053
 
 
1054
 
    .. change::
1055
 
        :tags: orm
1056
 
        :tickets: 1337
1057
 
 
1058
 
      Query.join() can now construct multiple FROM clauses, if
1059
 
      needed.  Such as, query(A, B).join(A.x).join(B.y)
1060
 
      might say SELECT A.*, B.* FROM A JOIN X, B JOIN Y.
1061
 
      Eager loading can also tack its joins onto those
1062
 
      multiple FROM clauses.
1063
 
 
1064
 
    .. change::
1065
 
        :tags: orm
1066
 
        :tickets: 1347
1067
 
 
1068
 
      Fixed bug in dynamic_loader() where append/remove events
1069
 
      after construction time were not being propagated to the
1070
 
      UOW to pick up on flush().
1071
 
 
1072
 
    .. change::
1073
 
        :tags: orm
1074
 
        :tickets: 
1075
 
 
1076
 
      Fixed bug where column_prefix wasn't being checked before
1077
 
      not mapping an attribute that already had class-level
1078
 
      name present.
1079
 
 
1080
 
    .. change::
1081
 
        :tags: orm
1082
 
        :tickets: 1315
1083
 
 
1084
 
      a session.expire() on a particular collection attribute
1085
 
      will clear any pending backref additions as well, so that
1086
 
      the next access correctly returns only what was present
1087
 
      in the database.  Presents some degree of a workaround for, although we are considering removing the
1088
 
      flush([objects]) feature altogether.
1089
 
 
1090
 
    .. change::
1091
 
        :tags: orm
1092
 
        :tickets: 
1093
 
 
1094
 
      Session.scalar() now converts raw SQL strings to text()
1095
 
      the same way Session.execute() does and accepts same
1096
 
      alternative \**kw args.
1097
 
 
1098
 
    .. change::
1099
 
        :tags: orm
1100
 
        :tickets: 
1101
 
 
1102
 
      improvements to the "determine direction" logic of
1103
 
      relation() such that the direction of tricky situations
1104
 
      like mapper(A.join(B)) -> relation-> mapper(B) can be
1105
 
      determined.
1106
 
 
1107
 
    .. change::
1108
 
        :tags: orm
1109
 
        :tickets: 1306
1110
 
 
1111
 
      When flushing partial sets of objects using session.flush([somelist]),
1112
 
      pending objects which remain pending after the operation won't
1113
 
      inadvertently be added as persistent.
1114
 
 
1115
 
    .. change::
1116
 
        :tags: orm
1117
 
        :tickets: 1314
1118
 
 
1119
 
      Added "post_configure_attribute" method to InstrumentationManager,
1120
 
      so that the "listen_for_events.py" example works again.
1121
 
 
1122
 
    .. change::
1123
 
        :tags: orm
1124
 
        :tickets: 
1125
 
 
1126
 
      a forward and complementing backwards reference which are both
1127
 
      of the same direction, i.e. ONETOMANY or MANYTOONE,
1128
 
      is now detected, and an error message is raised.
1129
 
      Saves crazy CircularDependencyErrors later on.
1130
 
 
1131
 
    .. change::
1132
 
        :tags: orm
1133
 
        :tickets: 
1134
 
 
1135
 
      Fixed bugs in Query regarding simultaneous selection of
1136
 
      multiple joined-table inheritance entities with common base
1137
 
      classes:
1138
 
      
1139
 
      - previously the adaption applied to "B" on
1140
 
        "A JOIN B" would be erroneously partially applied
1141
 
        to "A".
1142
 
      
1143
 
      - comparisons on relations (i.e. A.related==someb)
1144
 
        were not getting adapted when they should.
1145
 
      
1146
 
      - Other filterings, like
1147
 
        query(A).join(A.bs).filter(B.foo=='bar'), were erroneously
1148
 
        adapting "B.foo" as though it were an "A".
1149
 
 
1150
 
    .. change::
1151
 
        :tags: orm
1152
 
        :tickets: 1325
1153
 
 
1154
 
      Fixed adaptation of EXISTS clauses via any(), has(), etc.
1155
 
      in conjunction with an aliased object on the left and
1156
 
      of_type() on the right.
1157
 
 
1158
 
    .. change::
1159
 
        :tags: orm
1160
 
        :tickets: 
1161
 
 
1162
 
      Added an attribute helper method ``set_committed_value`` in
1163
 
      sqlalchemy.orm.attributes.  Given an object, attribute name,
1164
 
      and value, will set the value on the object as part of its
1165
 
      "committed" state, i.e. state that is understood to have
1166
 
      been loaded from the database.   Helps with the creation of
1167
 
      homegrown collection loaders and such.
1168
 
 
1169
 
    .. change::
1170
 
        :tags: orm
1171
 
        :tickets: 
1172
 
 
1173
 
      Query won't fail with weakref error when a non-mapper/class
1174
 
      instrumented descriptor is passed, raises
1175
 
      "Invalid column expession".
1176
 
 
1177
 
    .. change::
1178
 
        :tags: orm
1179
 
        :tickets: 
1180
 
 
1181
 
      Query.group_by() properly takes into account aliasing applied
1182
 
      to the FROM clause, such as with select_from(), using
1183
 
      with_polymorphic(), or using from_self().
1184
 
 
1185
 
    .. change::
1186
 
        :tags: sql
1187
 
        :tickets: 
1188
 
 
1189
 
      An alias() of a select() will convert to a "scalar subquery"
1190
 
      when used in an unambiguously scalar context, i.e. it's used
1191
 
      in a comparison operation.  This applies to
1192
 
      the ORM when using query.subquery() as well.
1193
 
 
1194
 
    .. change::
1195
 
        :tags: sql
1196
 
        :tickets: 1302
1197
 
 
1198
 
      Fixed missing _label attribute on Function object, others
1199
 
      when used in a select() with use_labels (such as when used
1200
 
      in an ORM column_property()).
1201
 
 
1202
 
    .. change::
1203
 
        :tags: sql
1204
 
        :tickets: 1309
1205
 
 
1206
 
      anonymous alias names now truncate down to the max length
1207
 
      allowed by the dialect.  More significant on DBs like
1208
 
      Oracle with very small character limits.
1209
 
 
1210
 
    .. change::
1211
 
        :tags: sql
1212
 
        :tickets: 
1213
 
 
1214
 
      the __selectable__() interface has been replaced entirely
1215
 
      by __clause_element__().
1216
 
 
1217
 
    .. change::
1218
 
        :tags: sql
1219
 
        :tickets: 1299
1220
 
 
1221
 
      The per-dialect cache used by TypeEngine to cache
1222
 
      dialect-specific types is now a WeakKeyDictionary.
1223
 
      This to prevent dialect objects from
1224
 
      being referenced forever for an application that
1225
 
      creates an arbitrarily large number of engines
1226
 
      or dialects.   There is a small performance penalty
1227
 
      which will be resolved in 0.6.
1228
 
 
1229
 
    .. change::
1230
 
        :tags: sqlite
1231
 
        :tickets: 
1232
 
 
1233
 
      Fixed SQLite reflection methods so that non-present
1234
 
      cursor.description, which triggers an auto-cursor
1235
 
      close, will be detected so that no results doesn't
1236
 
      fail on recent versions of pysqlite which raise
1237
 
      an error when fetchone() called with no rows present.
1238
 
 
1239
 
    .. change::
1240
 
        :tags: postgresql
1241
 
        :tickets: 
1242
 
 
1243
 
      Index reflection won't fail when an index with
1244
 
      multiple expressions is encountered.
1245
 
 
1246
 
    .. change::
1247
 
        :tags: postgresql
1248
 
        :tickets: 1327
1249
 
 
1250
 
      Added PGUuid and PGBit types to
1251
 
      sqlalchemy.databases.postgres.
1252
 
 
1253
 
    .. change::
1254
 
        :tags: postgresql
1255
 
        :tickets: 1327
1256
 
 
1257
 
      Refection of unknown PG types won't crash when those
1258
 
      types are specified within a domain.
1259
 
 
1260
 
    .. change::
1261
 
        :tags: mssql
1262
 
        :tickets: 
1263
 
 
1264
 
      Preliminary support for pymssql 1.0.1
1265
 
 
1266
 
    .. change::
1267
 
        :tags: mssql
1268
 
        :tickets: 
1269
 
 
1270
 
      Corrected issue on mssql where max_identifier_length was
1271
 
      not being respected.
1272
 
 
1273
 
    .. change::
1274
 
        :tags: extensions
1275
 
        :tickets: 
1276
 
 
1277
 
      Fixed a recursive pickling issue in serializer, triggered
1278
 
      by an EXISTS or other embedded FROM construct.
1279
 
 
1280
 
    .. change::
1281
 
        :tags: extensions
1282
 
        :tickets: 
1283
 
 
1284
 
      Declarative locates the "inherits" class using a search
1285
 
      through __bases__, to skip over mixins that are local
1286
 
      to subclasses.
1287
 
 
1288
 
    .. change::
1289
 
        :tags: extensions
1290
 
        :tickets: 
1291
 
 
1292
 
      Declarative figures out joined-table inheritance primary join
1293
 
      condition even if "inherits" mapper argument is given
1294
 
      explicitly.
1295
 
 
1296
 
    .. change::
1297
 
        :tags: extensions
1298
 
        :tickets: 
1299
 
 
1300
 
      Declarative will properly interpret the "foreign_keys" argument
1301
 
      on a backref() if it's a string.
1302
 
 
1303
 
    .. change::
1304
 
        :tags: extensions
1305
 
        :tickets: 
1306
 
 
1307
 
      Declarative will accept a table-bound column as a property
1308
 
      when used in conjunction with __table__, if the column is already
1309
 
      present in __table__.  The column will be remapped to the given
1310
 
      key the same way as when added to the mapper() properties dict.
1311
 
 
1312
 
.. changelog::
1313
 
    :version: 0.5.2
1314
 
    :released: Sat Jan 24 2009
1315
 
 
1316
 
    .. change::
1317
 
        :tags: orm
1318
 
        :tickets: 
1319
 
 
1320
 
      Further refined 0.5.1's warning about delete-orphan cascade
1321
 
      placed on a many-to-many relation.   First, the bad news:
1322
 
      the warning will apply to both many-to-many as well as
1323
 
      many-to-one relations.  This is necessary since in both
1324
 
      cases, SQLA does not scan the full set of potential parents
1325
 
      when determining "orphan" status - for a persistent object
1326
 
      it only detects an in-python de-association event to establish
1327
 
      the object as an "orphan".  Next, the good news: to support
1328
 
      one-to-one via a foreign key or assocation table, or to
1329
 
      support one-to-many via an association table, a new flag
1330
 
      single_parent=True may be set which indicates objects
1331
 
      linked to the relation are only meant to have a single parent.
1332
 
      The relation will raise an error if multiple parent-association
1333
 
      events occur within Python.
1334
 
 
1335
 
    .. change::
1336
 
        :tags: orm
1337
 
        :tickets: 1292
1338
 
 
1339
 
      Adjusted the attribute instrumentation change from 0.5.1 to
1340
 
      fully establish instrumentation for subclasses where the mapper
1341
 
      was created after the superclass had already been fully
1342
 
      instrumented.
1343
 
 
1344
 
    .. change::
1345
 
        :tags: orm
1346
 
        :tickets: 
1347
 
 
1348
 
      Fixed bug in delete-orphan cascade whereby two one-to-one
1349
 
      relations from two different parent classes to the same target
1350
 
      class would prematurely expunge the instance.
1351
 
 
1352
 
    .. change::
1353
 
        :tags: orm
1354
 
        :tickets: 
1355
 
 
1356
 
      Fixed an eager loading bug whereby self-referential eager
1357
 
      loading would prevent other eager loads, self referential or not,
1358
 
      from joining to the parent JOIN properly.  Thanks to Alex K
1359
 
      for creating a great test case.
1360
 
 
1361
 
    .. change::
1362
 
        :tags: orm
1363
 
        :tickets: 
1364
 
 
1365
 
      session.expire() and related methods will not expire() unloaded
1366
 
      deferred attributes.  This prevents them from being needlessly
1367
 
      loaded when the instance is refreshed.
1368
 
 
1369
 
    .. change::
1370
 
        :tags: orm
1371
 
        :tickets: 1293
1372
 
 
1373
 
      query.join()/outerjoin() will now properly join an aliased()
1374
 
      construct to the existing left side, even if query.from_self()
1375
 
      or query.select_from(someselectable) has been called.
1376
 
 
1377
 
    .. change::
1378
 
        :tags: sql
1379
 
        :tickets: 1284
1380
 
 
1381
 
      Further fixes to the "percent signs and spaces in column/table
1382
 
       names" functionality.
1383
 
 
1384
 
    .. change::
1385
 
        :tags: mssql
1386
 
        :tickets: 1291
1387
 
 
1388
 
      Restored convert_unicode handling. Results were being passed
1389
 
      on through without conversion.
1390
 
 
1391
 
    .. change::
1392
 
        :tags: mssql
1393
 
        :tickets: 1282
1394
 
 
1395
 
      Really fixing the decimal handling this time..
1396
 
 
1397
 
    .. change::
1398
 
        :tags: Ticket:1289, mssql
1399
 
        :tickets: 
1400
 
 
1401
 
      Modified table reflection code to use only kwargs when
1402
 
      constructing tables.
1403
 
 
1404
 
.. changelog::
1405
 
    :version: 0.5.1
1406
 
    :released: Sat Jan 17 2009
1407
 
 
1408
 
    .. change::
1409
 
        :tags: orm
1410
 
        :tickets: 
1411
 
 
1412
 
      Removed an internal join cache which could potentially leak
1413
 
      memory when issuing query.join() repeatedly to ad-hoc
1414
 
      selectables.
1415
 
 
1416
 
    .. change::
1417
 
        :tags: orm
1418
 
        :tickets: 
1419
 
 
1420
 
      The "clear()", "save()", "update()", "save_or_update()"
1421
 
      Session methods have been deprecated, replaced by
1422
 
      "expunge_all()" and "add()".  "expunge_all()" has also
1423
 
      been added to ScopedSession.
1424
 
 
1425
 
    .. change::
1426
 
        :tags: orm
1427
 
        :tickets: 
1428
 
 
1429
 
      Modernized the "no mapped table" exception and added a more
1430
 
      explicit __table__/__tablename__ exception to declarative.
1431
 
 
1432
 
    .. change::
1433
 
        :tags: orm
1434
 
        :tickets: 1237
1435
 
 
1436
 
      Concrete inheriting mappers now instrument attributes which
1437
 
      are inherited from the superclass, but are not defined for
1438
 
      the concrete mapper itself, with an InstrumentedAttribute that
1439
 
      issues a descriptive error when accessed.
1440
 
 
1441
 
    .. change::
1442
 
        :tags: orm
1443
 
        :tickets: 1237, 781
1444
 
 
1445
 
      Added a new `relation()` keyword `back_populates`. This
1446
 
      allows configuation of backreferences using explicit
1447
 
      relations. This is required when creating
1448
 
      bidirectional relations between a hierarchy of concrete
1449
 
      mappers and another class.
1450
 
 
1451
 
    .. change::
1452
 
        :tags: orm
1453
 
        :tickets: 1237
1454
 
 
1455
 
      Test coverage added for `relation()` objects specified on
1456
 
      concrete mappers.
1457
 
 
1458
 
    .. change::
1459
 
        :tags: orm
1460
 
        :tickets: 1276
1461
 
 
1462
 
      Query.from_self() as well as query.subquery() both disable
1463
 
      the rendering of eager joins inside the subquery produced.
1464
 
      The "disable all eager joins" feature is available publically
1465
 
      via a new query.enable_eagerloads() generative.
1466
 
 
1467
 
    .. change::
1468
 
        :tags: orm
1469
 
        :tickets: 
1470
 
 
1471
 
      Added a rudimental series of set operations to Query that
1472
 
      receive Query objects as arguments, including union(),
1473
 
      union_all(), intersect(), except_(), insertsect_all(),
1474
 
      except_all().  See the API documentation for
1475
 
      Query.union() for examples.
1476
 
 
1477
 
    .. change::
1478
 
        :tags: orm
1479
 
        :tickets: 
1480
 
 
1481
 
      Fixed bug that prevented Query.join() and eagerloads from
1482
 
      attaching to a query that selected from a union or aliased union.
1483
 
 
1484
 
    .. change::
1485
 
        :tags: orm
1486
 
        :tickets: 1237
1487
 
 
1488
 
      A short documentation example added for bidirectional
1489
 
      relations specified on concrete mappers.
1490
 
 
1491
 
    .. change::
1492
 
        :tags: orm
1493
 
        :tickets: 1269
1494
 
 
1495
 
      Mappers now instrument class attributes upon construction
1496
 
      with the final InstrumentedAttribute object which remains
1497
 
      persistent. The `_CompileOnAttr`/`__getattribute__()`
1498
 
      methodology has been removed. The net effect is that
1499
 
      Column-based mapped class attributes can now be used fully
1500
 
      at the class level without invoking a mapper compilation
1501
 
      operation, greatly simplifying typical usage patterns
1502
 
      within declarative.
1503
 
 
1504
 
    .. change::
1505
 
        :tags: orm
1506
 
        :tickets: 
1507
 
 
1508
 
      ColumnProperty (and front-end helpers such as ``deferred``) no
1509
 
      longer ignores unknown \**keyword arguments.
1510
 
 
1511
 
    .. change::
1512
 
        :tags: orm
1513
 
        :tickets: 
1514
 
 
1515
 
      Fixed a bug with the unitofwork's "row switch" mechanism,
1516
 
      i.e. the conversion of INSERT/DELETE into an UPDATE, when
1517
 
      combined with joined-table inheritance and an object
1518
 
      which contained no defined values for the child table where
1519
 
      an UPDATE with no SET clause would be rendered.
1520
 
 
1521
 
    .. change::
1522
 
        :tags: orm
1523
 
        :tickets: 1281
1524
 
 
1525
 
      Using delete-orphan on a many-to-many relation is deprecated.
1526
 
      This produces misleading or erroneous results since SQLA does
1527
 
      not retrieve the full list of "parents" for m2m.  To get delete-orphan
1528
 
      behavior with an m2m table, use an explcit association class
1529
 
      so that the individual association row is treated as a parent.
1530
 
 
1531
 
    .. change::
1532
 
        :tags: orm
1533
 
        :tickets: 1281
1534
 
 
1535
 
      delete-orphan cascade always requires delete cascade.  Specifying
1536
 
      delete-orphan without delete now raises a deprecation warning.
1537
 
 
1538
 
    .. change::
1539
 
        :tags: sql
1540
 
        :tickets: 1256
1541
 
 
1542
 
      Improved the methodology to handling percent signs in column
1543
 
      names from.  Added more tests.  MySQL and
1544
 
      PostgreSQL dialects still do not issue correct CREATE TABLE
1545
 
      statements for identifiers with percent signs in them.
1546
 
 
1547
 
    .. change::
1548
 
        :tags: schema
1549
 
        :tickets: 1214
1550
 
 
1551
 
      Index now accepts column-oriented InstrumentedAttributes
1552
 
      (i.e. column-based mapped class attributes) as column
1553
 
      arguments.
1554
 
 
1555
 
    .. change::
1556
 
        :tags: schema
1557
 
        :tickets: 
1558
 
 
1559
 
      Column with no name (as in declarative) won't raise a
1560
 
      NoneType error when it's string output is requsted
1561
 
      (such as in a stack trace).
1562
 
 
1563
 
    .. change::
1564
 
        :tags: schema
1565
 
        :tickets: 1278
1566
 
 
1567
 
      Fixed bug when overriding a Column with a ForeignKey
1568
 
      on a reflected table, where derived columns (i.e. the
1569
 
      "virtual" columns of a select, etc.) would inadvertently
1570
 
      call upon schema-level cleanup logic intended only
1571
 
      for the original column.
1572
 
 
1573
 
    .. change::
1574
 
        :tags: declarative
1575
 
        :tickets: 
1576
 
 
1577
 
      Can now specify Column objects on subclasses which have no
1578
 
      table of their own (i.e. use single table inheritance).
1579
 
      The columns will be appended to the base table, but only
1580
 
      mapped by the subclass.
1581
 
 
1582
 
    .. change::
1583
 
        :tags: declarative
1584
 
        :tickets: 
1585
 
 
1586
 
      For both joined and single inheriting subclasses, the subclass
1587
 
      will only map those columns which are already mapped on the
1588
 
      superclass and those explicit on the subclass.  Other
1589
 
      columns that are present on the `Table` will be excluded
1590
 
      from the mapping by default, which can be disabled
1591
 
      by passing a blank `exclude_properties` collection to the
1592
 
      `__mapper_args__`.  This is so that single-inheriting
1593
 
      classes which define their own columns are the only classes
1594
 
      to map those columns.   The effect is actually a more organized
1595
 
      mapping than you'd normally get with explicit `mapper()`
1596
 
      calls unless you set up the `exclude_properties` arguments
1597
 
      explicitly.
1598
 
 
1599
 
    .. change::
1600
 
        :tags: declarative
1601
 
        :tickets: 
1602
 
 
1603
 
      It's an error to add new Column objects to a declarative class
1604
 
      that specified an existing table using __table__.
1605
 
 
1606
 
    .. change::
1607
 
        :tags: mysql
1608
 
        :tickets: 
1609
 
 
1610
 
      Added the missing keywords from MySQL 4.1 so they get escaped
1611
 
      properly.
1612
 
 
1613
 
    .. change::
1614
 
        :tags: mssql
1615
 
        :tickets: 1280
1616
 
 
1617
 
      Corrected handling of large decimal values with more robust
1618
 
      tests. Removed string manipulation on floats.
1619
 
 
1620
 
    .. change::
1621
 
        :tags: mssql
1622
 
        :tickets: 
1623
 
 
1624
 
      Modified the do_begin handling in mssql to use the Cursor not
1625
 
      the Connection so it is DBAPI compatible.
1626
 
 
1627
 
    .. change::
1628
 
        :tags: mssql
1629
 
        :tickets: 
1630
 
 
1631
 
      Corrected SAVEPOINT support on adodbapi by changing the
1632
 
      handling of savepoint_release, which is unsupported on mssql.
1633
 
 
1634
 
.. changelog::
1635
 
    :version: 0.5.0
1636
 
    :released: Tue Jan 06 2009
1637
 
 
1638
 
    .. change::
1639
 
        :tags: general
1640
 
        :tickets: 
1641
 
 
1642
 
      Documentation has been converted to Sphinx.  In particular,
1643
 
      the generated API documentation has been constructed into a
1644
 
      full blown "API Reference" section which organizes editorial
1645
 
      documentation combined with generated docstrings.  Cross
1646
 
      linking between sections and API docs are vastly improved, a
1647
 
      javascript-powered search feature is provided, and a full
1648
 
      index of all classes, functions and members is provided.
1649
 
 
1650
 
    .. change::
1651
 
        :tags: general
1652
 
        :tickets: 
1653
 
 
1654
 
      setup.py now imports setuptools only optionally.  If not
1655
 
      present, distutils is used.  The new "pip" installer is
1656
 
      recommended over easy_install as it installs in a more
1657
 
      simplified way.
1658
 
 
1659
 
    .. change::
1660
 
        :tags: general
1661
 
        :tickets: 
1662
 
 
1663
 
      added an extremely basic illustration of a PostGIS integration
1664
 
      to the examples folder.
1665
 
 
1666
 
    .. change::
1667
 
        :tags: orm
1668
 
        :tickets: 
1669
 
 
1670
 
      Query.with_polymorphic() now accepts a third argument
1671
 
      "discriminator" which will replace the value of
1672
 
      mapper.polymorphic_on for that query.  Mappers themselves no
1673
 
      longer require polymorphic_on to be set, even if the mapper
1674
 
      has a polymorphic_identity.  When not set, the mapper will
1675
 
      load non-polymorphically by default. Together, these two
1676
 
      features allow a non-polymorphic concrete inheritance setup to
1677
 
      use polymorphic loading on a per-query basis, since concrete
1678
 
      setups are prone to many issues when used polymorphically in
1679
 
      all cases.
1680
 
 
1681
 
    .. change::
1682
 
        :tags: orm
1683
 
        :tickets: 
1684
 
 
1685
 
      dynamic_loader accepts a query_class= to customize the Query
1686
 
      classes used for both the dynamic collection and the queries
1687
 
      built from it.
1688
 
 
1689
 
    .. change::
1690
 
        :tags: orm
1691
 
        :tickets: 1079
1692
 
 
1693
 
      query.order_by() accepts None which will remove any pending
1694
 
      order_by state from the query, as well as cancel out any
1695
 
      mapper/relation configured ordering. This is primarily useful
1696
 
      for overriding the ordering specified on a dynamic_loader().
1697
 
 
1698
 
    .. change::
1699
 
        :tags: sql
1700
 
        :tickets: 935
1701
 
 
1702
 
      RowProxy objects can be used in place of dictionary arguments
1703
 
      sent to connection.execute() and friends.
1704
 
 
1705
 
    .. change::
1706
 
        :tags: dialect
1707
 
        :tickets: 
1708
 
 
1709
 
      Added a new description_encoding attribute on the dialect that
1710
 
      is used for encoding the column name when processing the
1711
 
      metadata. This usually defaults to utf-8.
1712
 
 
1713
 
    .. change::
1714
 
        :tags: mssql
1715
 
        :tickets: 
1716
 
 
1717
 
      Added in a new MSGenericBinary type. This maps to the Binary
1718
 
      type so it can implement the specialized behavior of treating
1719
 
      length specified types as fixed-width Binary types and
1720
 
      non-length types as an unbound variable length Binary type.
1721
 
 
1722
 
    .. change::
1723
 
        :tags: mssql
1724
 
        :tickets: 1249
1725
 
 
1726
 
      Added in new types: MSVarBinary and MSImage.
1727
 
 
1728
 
    .. change::
1729
 
        :tags: mssql
1730
 
        :tickets: 
1731
 
 
1732
 
      Added in the MSReal, MSNText, MSSmallDateTime, MSTime,
1733
 
      MSDateTimeOffset, and MSDateTime2 types
1734
 
 
1735
 
    .. change::
1736
 
        :tags: sqlite
1737
 
        :tickets: 1266
1738
 
 
1739
 
      Table reflection now stores the actual DefaultClause value for
1740
 
      the column.
1741
 
 
1742
 
    .. change::
1743
 
        :tags: sqlite
1744
 
        :tickets: 
1745
 
 
1746
 
      bugfixes, behavioral changes
1747
 
 
1748
 
    .. change::
1749
 
        :tags: orm
1750
 
        :tickets: 
1751
 
 
1752
 
      Exceptions raised during compile_mappers() are now preserved
1753
 
      to provide "sticky behavior" - if a hasattr() call on a
1754
 
      pre-compiled mapped attribute triggers a failing compile and
1755
 
      suppresses the exception, subsequent compilation is blocked
1756
 
      and the exception will be reiterated on the next compile()
1757
 
      call.  This issue occurs frequently when using declarative.
1758
 
 
1759
 
    .. change::
1760
 
        :tags: orm
1761
 
        :tickets: 
1762
 
 
1763
 
      property.of_type() is now recognized on a single-table
1764
 
      inheriting target, when used in the context of
1765
 
      prop.of_type(..).any()/has(), as well as
1766
 
      query.join(prop.of_type(...)).
1767
 
 
1768
 
    .. change::
1769
 
        :tags: orm
1770
 
        :tickets: 
1771
 
 
1772
 
      query.join() raises an error when the target of the join
1773
 
      doesn't match the property-based attribute - while it's
1774
 
      unlikely anyone is doing this, the SQLAlchemy author was
1775
 
      guilty of this particular loosey-goosey behavior.
1776
 
 
1777
 
    .. change::
1778
 
        :tags: orm
1779
 
        :tickets: 1272
1780
 
 
1781
 
      Fixed bug when using weak_instance_map=False where modified
1782
 
      events would not be intercepted for a flush().
1783
 
 
1784
 
    .. change::
1785
 
        :tags: orm
1786
 
        :tickets: 1268
1787
 
 
1788
 
      Fixed some deep "column correspondence" issues which could
1789
 
      impact a Query made against a selectable containing multiple
1790
 
      versions of the same table, as well as unions and similar
1791
 
      which contained the same table columns in different column
1792
 
      positions at different levels.
1793
 
 
1794
 
    .. change::
1795
 
        :tags: orm
1796
 
        :tickets: 
1797
 
 
1798
 
      Custom comparator classes used in conjunction with
1799
 
      column_property(), relation() etc. can define new comparison
1800
 
      methods on the Comparator, which will become available via
1801
 
      __getattr__() on the InstrumentedAttribute.  In the case of
1802
 
      synonym() or comparable_property(), attributes are resolved
1803
 
      first on the user-defined descriptor, then on the user-defined
1804
 
      comparator.
1805
 
 
1806
 
    .. change::
1807
 
        :tags: orm
1808
 
        :tickets: 976
1809
 
 
1810
 
      Added ScopedSession.is_active accessor.
1811
 
 
1812
 
    .. change::
1813
 
        :tags: orm
1814
 
        :tickets: 1262
1815
 
 
1816
 
      Can pass mapped attributes and column objects as keys to
1817
 
      query.update({}).
1818
 
 
1819
 
    .. change::
1820
 
        :tags: orm
1821
 
        :tickets: 
1822
 
 
1823
 
      Mapped attributes passed to the values() of an expression
1824
 
      level insert() or update() will use the keys of the mapped
1825
 
      columns, not that of the mapped attribute.
1826
 
 
1827
 
    .. change::
1828
 
        :tags: orm
1829
 
        :tickets: 1242
1830
 
 
1831
 
      Corrected problem with Query.delete() and Query.update() not
1832
 
      working properly with bind parameters.
1833
 
 
1834
 
    .. change::
1835
 
        :tags: orm
1836
 
        :tickets: 
1837
 
 
1838
 
      Query.select_from(), from_statement() ensure that the given
1839
 
      argument is a FromClause, or Text/Select/Union, respectively.
1840
 
 
1841
 
    .. change::
1842
 
        :tags: orm
1843
 
        :tickets: 1253
1844
 
 
1845
 
      Query() can be passed a "composite" attribute as a column
1846
 
      expression and it will be expanded.  Somewhat related to.
1847
 
 
1848
 
    .. change::
1849
 
        :tags: orm
1850
 
        :tickets: 
1851
 
 
1852
 
      Query() is a little more robust when passed various column
1853
 
      expressions such as strings, clauselists, text() constructs
1854
 
      (which may mean it just raises an error more nicely).
1855
 
 
1856
 
    .. change::
1857
 
        :tags: orm
1858
 
        :tickets: 
1859
 
 
1860
 
      first() works as expected with Query.from_statement().
1861
 
 
1862
 
    .. change::
1863
 
        :tags: orm
1864
 
        :tickets: 
1865
 
 
1866
 
      Fixed bug introduced in 0.5rc4 involving eager loading not
1867
 
      functioning for properties which were added to a mapper
1868
 
      post-compile using add_property() or equivalent.
1869
 
 
1870
 
    .. change::
1871
 
        :tags: orm
1872
 
        :tickets: 
1873
 
 
1874
 
      Fixed bug where many-to-many relation() with viewonly=True
1875
 
      would not correctly reference the link between
1876
 
      secondary->remote.
1877
 
 
1878
 
    .. change::
1879
 
        :tags: orm
1880
 
        :tickets: 1232
1881
 
 
1882
 
      Duplicate items in a list-based collection will be maintained
1883
 
      when issuing INSERTs to a "secondary" table in a many-to-many
1884
 
      relation.  Assuming the m2m table has a unique or primary key
1885
 
      constraint on it, this will raise the expected constraint
1886
 
      violation instead of silently dropping the duplicate
1887
 
      entries. Note that the old behavior remains for a one-to-many
1888
 
      relation since collection entries in that case don't result in
1889
 
      INSERT statements and SQLA doesn't manually police
1890
 
      collections.
1891
 
 
1892
 
    .. change::
1893
 
        :tags: orm
1894
 
        :tickets: 
1895
 
 
1896
 
      Query.add_column() can accept FromClause objects in the same
1897
 
      manner as session.query() can.
1898
 
 
1899
 
    .. change::
1900
 
        :tags: orm
1901
 
        :tickets: 
1902
 
 
1903
 
      Comparison of many-to-one relation to NULL is properly
1904
 
      converted to IS NOT NULL based on not_().
1905
 
 
1906
 
    .. change::
1907
 
        :tags: orm
1908
 
        :tickets: 1087
1909
 
 
1910
 
      Extra checks added to ensure explicit
1911
 
      primaryjoin/secondaryjoin are ClauseElement instances, to
1912
 
      prevent more confusing errors later on.
1913
 
 
1914
 
    .. change::
1915
 
        :tags: orm
1916
 
        :tickets: 1236
1917
 
 
1918
 
      Improved mapper() check for non-class classes.
1919
 
 
1920
 
    .. change::
1921
 
        :tags: orm
1922
 
        :tickets: 5051
1923
 
 
1924
 
      comparator_factory argument is now documented and supported by
1925
 
      all MapperProperty types, including column_property(),
1926
 
      relation(), backref(), and synonym().
1927
 
 
1928
 
    .. change::
1929
 
        :tags: orm
1930
 
        :tickets: 
1931
 
 
1932
 
      Changed the name of PropertyLoader to RelationProperty, to be
1933
 
      consistent with all the other names.  PropertyLoader is still
1934
 
      present as a synonym.
1935
 
 
1936
 
    .. change::
1937
 
        :tags: orm
1938
 
        :tickets: 1099, 1228
1939
 
 
1940
 
      fixed "double iter()" call causing bus errors in shard API,
1941
 
      removed errant result.close() left over from the 0.4
1942
 
      version.
1943
 
 
1944
 
    .. change::
1945
 
        :tags: orm
1946
 
        :tickets: 
1947
 
 
1948
 
      made Session.merge cascades not trigger autoflush.  Fixes
1949
 
      merged instances getting prematurely inserted with missing
1950
 
      values.
1951
 
 
1952
 
    .. change::
1953
 
        :tags: orm
1954
 
        :tickets: 
1955
 
 
1956
 
      Two fixes to help prevent out-of-band columns from being
1957
 
      rendered in polymorphic_union inheritance scenarios (which
1958
 
      then causes extra tables to be rendered in the FROM clause
1959
 
      causing cartesian products):
1960
 
      
1961
 
        - improvements to "column adaption" for a->b->c inheritance
1962
 
          situations to better locate columns that are related to
1963
 
          one another via multiple levels of indirection, rather
1964
 
          than rendering the non-adapted column.
1965
 
      
1966
 
        - the "polymorphic discriminator" column is only rendered
1967
 
          for the actual mapper being queried against. The column
1968
 
          won't be "pulled in" from a subclass or superclass mapper
1969
 
          since it's not needed.
1970
 
 
1971
 
    .. change::
1972
 
        :tags: orm
1973
 
        :tickets: 1072
1974
 
 
1975
 
      Fixed shard_id argument on ShardedSession.execute().
1976
 
 
1977
 
    .. change::
1978
 
        :tags: sql
1979
 
        :tickets: 1256
1980
 
 
1981
 
      Columns can again contain percent signs within their
1982
 
      names.
1983
 
 
1984
 
    .. change::
1985
 
        :tags: sql
1986
 
        :tickets: 
1987
 
 
1988
 
      sqlalchemy.sql.expression.Function is now a public class.  It
1989
 
      can be subclassed to provide user-defined SQL functions in an
1990
 
      imperative style, including with pre-established behaviors.
1991
 
      The postgis.py example illustrates one usage of this.
1992
 
 
1993
 
    .. change::
1994
 
        :tags: sql
1995
 
        :tickets: 
1996
 
 
1997
 
      PickleType now favors == comparison by default, if the
1998
 
      incoming object (such as a dict) implements __eq__().  If the
1999
 
      object does not implement __eq__() and mutable=True, a
2000
 
      deprecation warning is raised.
2001
 
 
2002
 
    .. change::
2003
 
        :tags: sql
2004
 
        :tickets: 1215
2005
 
 
2006
 
      Fixed the import weirdness in sqlalchemy.sql to not export
2007
 
      __names__.
2008
 
 
2009
 
    .. change::
2010
 
        :tags: sql
2011
 
        :tickets: 1238
2012
 
 
2013
 
      Using the same ForeignKey object repeatedly raises an error
2014
 
      instead of silently failing later.
2015
 
 
2016
 
    .. change::
2017
 
        :tags: sql
2018
 
        :tickets: 
2019
 
 
2020
 
      Added NotImplementedError for params() method on
2021
 
      Insert/Update/Delete constructs.  These items currently don't
2022
 
      support this functionality, which also would be a little
2023
 
      misleading compared to values().
2024
 
 
2025
 
    .. change::
2026
 
        :tags: sql
2027
 
        :tickets: 650
2028
 
 
2029
 
      Reflected foreign keys will properly locate their referenced
2030
 
      column, even if the column was given a "key" attribute
2031
 
      different from the reflected name.  This is achieved via a new
2032
 
      flag on ForeignKey/ForeignKeyConstraint called "link_to_name",
2033
 
      if True means the given name is the referred-to column's name,
2034
 
      not its assigned key.
2035
 
 
2036
 
    .. change::
2037
 
        :tags: sql
2038
 
        :tickets: 1253
2039
 
 
2040
 
      select() can accept a ClauseList as a column in the same way
2041
 
      as a Table or other selectable and the interior expressions
2042
 
      will be used as column elements.
2043
 
 
2044
 
    .. change::
2045
 
        :tags: sql
2046
 
        :tickets: 
2047
 
 
2048
 
      the "passive" flag on session.is_modified() is correctly
2049
 
      propagated to the attribute manager.
2050
 
 
2051
 
    .. change::
2052
 
        :tags: sql
2053
 
        :tickets: 
2054
 
 
2055
 
      union() and union_all() will not whack any order_by() that has
2056
 
      been applied to the select()s inside.  If you union() a
2057
 
      select() with order_by() (presumably to support LIMIT/OFFSET),
2058
 
      you should also call self_group() on it to apply parenthesis.
2059
 
 
2060
 
    .. change::
2061
 
        :tags: engine/pool
2062
 
        :tickets: 1246
2063
 
 
2064
 
      Connection.invalidate() checks for closed status to avoid
2065
 
      attribute errors.
2066
 
 
2067
 
    .. change::
2068
 
        :tags: engine/pool
2069
 
        :tickets: 1094
2070
 
 
2071
 
      NullPool supports reconnect on failure behavior.
2072
 
 
2073
 
    .. change::
2074
 
        :tags: engine/pool
2075
 
        :tickets: 799
2076
 
 
2077
 
      Added a mutex for the initial pool creation when using
2078
 
      pool.manage(dbapi).  This prevents a minor case of "dogpile"
2079
 
      behavior which would otherwise occur upon a heavy load
2080
 
      startup.
2081
 
 
2082
 
    .. change::
2083
 
        :tags: engine/pool
2084
 
        :tickets: 
2085
 
 
2086
 
      _execute_clauseelement() goes back to being a private method.
2087
 
      Subclassing Connection is not needed now that ConnectionProxy
2088
 
      is available.
2089
 
 
2090
 
    .. change::
2091
 
        :tags: documentation
2092
 
        :tickets: 1149, 1200
2093
 
 
2094
 
      Tickets.
2095
 
 
2096
 
    .. change::
2097
 
        :tags: documentation
2098
 
        :tickets: 
2099
 
 
2100
 
      Added note about create_session() defaults.
2101
 
 
2102
 
    .. change::
2103
 
        :tags: documentation
2104
 
        :tickets: 
2105
 
 
2106
 
      Added section about metadata.reflect().
2107
 
 
2108
 
    .. change::
2109
 
        :tags: documentation
2110
 
        :tickets: 
2111
 
 
2112
 
      Updated `TypeDecorator` section.
2113
 
 
2114
 
    .. change::
2115
 
        :tags: documentation
2116
 
        :tickets: 
2117
 
 
2118
 
      Rewrote the "threadlocal" strategy section of the docs due to
2119
 
      recent confusion over this feature.
2120
 
 
2121
 
    .. change::
2122
 
        :tags: documentation
2123
 
        :tickets: 
2124
 
 
2125
 
      Removed badly out of date 'polymorphic_fetch' and
2126
 
      'select_table' docs from inheritance, reworked the second half
2127
 
      of "joined table inheritance".
2128
 
 
2129
 
    .. change::
2130
 
        :tags: documentation
2131
 
        :tickets: 
2132
 
 
2133
 
      Documented `comparator_factory` kwarg, added new doc section
2134
 
      "Custom Comparators".
2135
 
 
2136
 
    .. change::
2137
 
        :tags: mssql
2138
 
        :tickets: 1254
2139
 
 
2140
 
      Refactored the Date/Time types. The ``smalldatetime`` data
2141
 
      type no longer truncates to a date only, and will now be
2142
 
      mapped to the MSSmallDateTime type.
2143
 
 
2144
 
    .. change::
2145
 
        :tags: mssql
2146
 
        :tickets: 
2147
 
 
2148
 
      Corrected an issue with Numerics to accept an int.
2149
 
 
2150
 
    .. change::
2151
 
        :tags: mssql
2152
 
        :tickets: 
2153
 
 
2154
 
      Mapped ``char_length`` to the ``LEN()`` function.
2155
 
 
2156
 
    .. change::
2157
 
        :tags: mssql
2158
 
        :tickets: 
2159
 
 
2160
 
      If an ``INSERT`` includes a subselect the ``INSERT`` is
2161
 
      converted from an ``INSERT INTO VALUES`` construct to a
2162
 
      ``INSERT INTO SELECT`` construct.
2163
 
 
2164
 
    .. change::
2165
 
        :tags: mssql
2166
 
        :tickets: 
2167
 
 
2168
 
      If the column is part of a ``primary_key`` it will be ``NOT
2169
 
      NULL`` since MSSQL doesn't allow ``NULL`` in primary_key
2170
 
      columns.
2171
 
 
2172
 
    .. change::
2173
 
        :tags: mssql
2174
 
        :tickets: 1249
2175
 
 
2176
 
      ``MSBinary`` now returns a ``BINARY`` instead of an
2177
 
      ``IMAGE``. This is a backwards incompatible change in that
2178
 
      ``BINARY`` is a fixed length data type whereas ``IMAGE`` is a
2179
 
      variable length data type.
2180
 
 
2181
 
    .. change::
2182
 
        :tags: mssql
2183
 
        :tickets: 1258
2184
 
 
2185
 
      ``get_default_schema_name`` is now reflected from the database
2186
 
      based on the user's default schema. This only works with MSSQL
2187
 
      2005 and later.
2188
 
 
2189
 
    .. change::
2190
 
        :tags: mssql
2191
 
        :tickets: 1248
2192
 
 
2193
 
      Added collation support through the use of a new collation
2194
 
      argument. This is supported on the following types: char,
2195
 
      nchar, varchar, nvarchar, text, ntext.
2196
 
 
2197
 
    .. change::
2198
 
        :tags: mssql
2199
 
        :tickets: 
2200
 
 
2201
 
      Changes to the connection string parameters favor DSN as the
2202
 
      default specification for pyodbc. See the mssql.py docstring
2203
 
      for detailed usage instructions.
2204
 
 
2205
 
    .. change::
2206
 
        :tags: mssql
2207
 
        :tickets: 
2208
 
 
2209
 
      Added experimental support of savepoints. It currently does
2210
 
      not work fully with sessions.
2211
 
 
2212
 
    .. change::
2213
 
        :tags: mssql
2214
 
        :tickets: 1243
2215
 
 
2216
 
      Support for three levels of column nullability: NULL, NOT
2217
 
      NULL, and the database's configured default.  The default
2218
 
      Column configuration (nullable=True) will now generate NULL in
2219
 
      the DDL. Previously no specification was emitted and the
2220
 
      database default would take effect (usually NULL, but not
2221
 
      always).  To explicitly request the database default,
2222
 
      configure columns with nullable=None and no specification will
2223
 
      be emitted in DDL. This is backwards incompatible
2224
 
      behavior.
2225
 
 
2226
 
    .. change::
2227
 
        :tags: postgres
2228
 
        :tickets: 1267
2229
 
 
2230
 
      "%" signs in text() constructs are automatically escaped to
2231
 
      "%%".  Because of the backwards incompatible nature of this
2232
 
      change, a warning is emitted if '%%' is detected in the
2233
 
      string.
2234
 
 
2235
 
    .. change::
2236
 
        :tags: postgres
2237
 
        :tickets: 
2238
 
 
2239
 
      Calling alias.execute() in conjunction with
2240
 
      server_side_cursors won't raise AttributeError.
2241
 
 
2242
 
    .. change::
2243
 
        :tags: postgres
2244
 
        :tickets: 714
2245
 
 
2246
 
      Added Index reflection support to PostgreSQL, using a great
2247
 
      patch we long neglected, submitted by Ken
2248
 
      Kuhlman.
2249
 
 
2250
 
    .. change::
2251
 
        :tags: oracle
2252
 
        :tickets: 
2253
 
 
2254
 
      Adjusted the format of create_xid() to repair two-phase
2255
 
      commit.  We now have field reports of Oracle two-phase commit
2256
 
      working properly with this change.
2257
 
 
2258
 
    .. change::
2259
 
        :tags: oracle
2260
 
        :tickets: 1233
2261
 
 
2262
 
      Added OracleNVarchar type, produces NVARCHAR2, and also
2263
 
      subclasses Unicode so that convert_unicode=True by default.
2264
 
      NVARCHAR2 reflects into this type automatically so these
2265
 
      columns pass unicode on a reflected table with no explicit
2266
 
      convert_unicode=True flags.
2267
 
 
2268
 
    .. change::
2269
 
        :tags: oracle
2270
 
        :tickets: 1265
2271
 
 
2272
 
      Fixed bug which was preventing out params of certain types
2273
 
      from being received; thanks a ton to huddlej at wwu.edu !
2274
 
 
2275
 
    .. change::
2276
 
        :tags: mysql
2277
 
        :tickets: 
2278
 
 
2279
 
      "%" signs in text() constructs are automatically escaped to
2280
 
      "%%".  Because of the backwards incompatible nature of this
2281
 
      change, a warning is emitted if '%%' is detected in the
2282
 
      string.
2283
 
 
2284
 
    .. change::
2285
 
        :tags: mysql
2286
 
        :tickets: 1241
2287
 
 
2288
 
      Fixed bug in exception raise when FK columns not present
2289
 
      during reflection.
2290
 
 
2291
 
    .. change::
2292
 
        :tags: mysql
2293
 
        :tickets: 
2294
 
 
2295
 
      Fixed bug involving reflection of a remote-schema table with a
2296
 
      foreign key ref to another table in that schema.
2297
 
 
2298
 
    .. change::
2299
 
        :tags: associationproxy
2300
 
        :tickets: 
2301
 
 
2302
 
      The association proxy properties are make themselves available
2303
 
      at the class level, e.g. MyClass.aproxy.  Previously this
2304
 
      evaluated to None.
2305
 
 
2306
 
    .. change::
2307
 
        :tags: declarative
2308
 
        :tickets: 
2309
 
 
2310
 
      The full list of arguments accepted as string by backref()
2311
 
      includes 'primaryjoin', 'secondaryjoin', 'secondary',
2312
 
      'foreign_keys', 'remote_side', 'order_by'.
2313
 
 
2314
 
.. changelog::
2315
 
    :version: 0.5.0rc4
2316
 
    :released: Fri Nov 14 2008
2317
 
 
2318
 
    .. change::
2319
 
        :tags: orm
2320
 
        :tickets: 
2321
 
 
2322
 
      Query.count() has been enhanced to do the "right thing" in a
2323
 
      wider variety of cases. It can now count multiple-entity
2324
 
      queries, as well as column-based queries. Note that this means
2325
 
      if you say query(A, B).count() without any joining criterion,
2326
 
      it's going to count the cartesian product of A*B. Any query
2327
 
      which is against column-based entities will automatically
2328
 
      issue "SELECT count(1) FROM (SELECT...)" so that the real
2329
 
      rowcount is returned, meaning a query such as
2330
 
      query(func.count(A.name)).count() will return a value of one,
2331
 
      since that query would return one row.
2332
 
 
2333
 
    .. change::
2334
 
        :tags: orm
2335
 
        :tickets: 
2336
 
 
2337
 
      Lots of performance tuning.  A rough guesstimate over various
2338
 
      ORM operations places it 10% faster over 0.5.0rc3, 25-30% over
2339
 
      0.4.8.
2340
 
 
2341
 
    .. change::
2342
 
        :tags: orm
2343
 
        :tickets: 
2344
 
 
2345
 
      bugfixes and behavioral changes
2346
 
 
2347
 
    .. change::
2348
 
        :tags: general
2349
 
        :tickets: 
2350
 
 
2351
 
      global "propigate"->"propagate" change.
2352
 
 
2353
 
    .. change::
2354
 
        :tags: orm
2355
 
        :tickets: 
2356
 
 
2357
 
      Adjustments to the enhanced garbage collection on
2358
 
      InstanceState to better guard against errors due to lost
2359
 
      state.
2360
 
 
2361
 
    .. change::
2362
 
        :tags: orm
2363
 
        :tickets: 1220
2364
 
 
2365
 
      Query.get() returns a more informative error message when
2366
 
      executed against multiple entities.
2367
 
 
2368
 
    .. change::
2369
 
        :tags: orm
2370
 
        :tickets: 1140, 1221
2371
 
 
2372
 
      Restored NotImplementedError on Cls.relation.in_()
2373
 
 
2374
 
    .. change::
2375
 
        :tags: orm
2376
 
        :tickets: 1226
2377
 
 
2378
 
      Fixed PendingDeprecationWarning involving order_by parameter
2379
 
      on relation().
2380
 
 
2381
 
    .. change::
2382
 
        :tags: sql
2383
 
        :tickets: 
2384
 
 
2385
 
      Removed the 'properties' attribute of the Connection object,
2386
 
      Connection.info should be used.
2387
 
 
2388
 
    .. change::
2389
 
        :tags: sql
2390
 
        :tickets: 
2391
 
 
2392
 
      Restored "active rowcount" fetch before ResultProxy autocloses
2393
 
      the cursor.  This was removed in 0.5rc3.
2394
 
 
2395
 
    .. change::
2396
 
        :tags: sql
2397
 
        :tickets: 
2398
 
 
2399
 
      Rearranged the `load_dialect_impl()` method in `TypeDecorator`
2400
 
      such that it will take effect even if the user-defined
2401
 
      `TypeDecorator` uses another `TypeDecorator` as its impl.
2402
 
 
2403
 
    .. change::
2404
 
        :tags: access
2405
 
        :tickets: 
2406
 
 
2407
 
      Added support for Currency type.
2408
 
 
2409
 
    .. change::
2410
 
        :tags: access
2411
 
        :tickets: 1017
2412
 
 
2413
 
      Functions were not return their result.
2414
 
 
2415
 
    .. change::
2416
 
        :tags: access
2417
 
        :tickets: 1017
2418
 
 
2419
 
      Corrected problem with joins. Access only support LEFT OUTER
2420
 
      or INNER not just JOIN by itself.
2421
 
 
2422
 
    .. change::
2423
 
        :tags: mssql
2424
 
        :tickets: 
2425
 
 
2426
 
      Lots of cleanup and fixes to correct problems with limit and
2427
 
      offset.
2428
 
 
2429
 
    .. change::
2430
 
        :tags: mssql
2431
 
        :tickets: 
2432
 
 
2433
 
      Correct situation where subqueries as part of a binary
2434
 
      expression need to be translated to use the IN and NOT IN
2435
 
      syntax.
2436
 
 
2437
 
    .. change::
2438
 
        :tags: mssql
2439
 
        :tickets: 1216
2440
 
 
2441
 
      Fixed E Notation issue that prevented the ability to insert
2442
 
      decimal values less than 1E-6.
2443
 
 
2444
 
    .. change::
2445
 
        :tags: mssql
2446
 
        :tickets: 1217
2447
 
 
2448
 
      Corrected problems with reflection when dealing with schemas,
2449
 
      particularly when those schemas are the default
2450
 
      schema.
2451
 
 
2452
 
    .. change::
2453
 
        :tags: mssql
2454
 
        :tickets: 
2455
 
 
2456
 
      Corrected problem with casting a zero length item to a
2457
 
      varchar. It now correctly adjusts the CAST.
2458
 
 
2459
 
    .. change::
2460
 
        :tags: ext
2461
 
        :tickets: 
2462
 
 
2463
 
      Can now use a custom "inherit_condition" in __mapper_args__
2464
 
      when using declarative.
2465
 
 
2466
 
    .. change::
2467
 
        :tags: ext
2468
 
        :tickets: 
2469
 
 
2470
 
      fixed string-based "remote_side", "order_by" and others not
2471
 
      propagating correctly when used in backref().
2472
 
 
2473
 
.. changelog::
2474
 
    :version: 0.5.0rc3
2475
 
    :released: Fri Nov 07 2008
2476
 
 
2477
 
    .. change::
2478
 
        :tags: orm
2479
 
        :tickets: 
2480
 
 
2481
 
      Added two new hooks to SessionExtension: after_bulk_delete()
2482
 
      and after_bulk_update().  after_bulk_delete() is called after
2483
 
      a bulk delete() operation on a query. after_bulk_update() is
2484
 
      called after a bulk update() operation on a query.
2485
 
 
2486
 
    .. change::
2487
 
        :tags: sql
2488
 
        :tickets: 
2489
 
 
2490
 
      SQL compiler optimizations and complexity reduction. The call
2491
 
      count for compiling a typical select() construct is 20% less
2492
 
      versus 0.5.0rc2.
2493
 
 
2494
 
    .. change::
2495
 
        :tags: sql
2496
 
        :tickets: 1211
2497
 
 
2498
 
      Dialects can now generate label names of adjustable
2499
 
      length. Pass in the argument "label_length=<value>" to
2500
 
      create_engine() to adjust how many characters max will be
2501
 
      present in dynamically generated column labels, i.e.
2502
 
      "somecolumn AS somelabel". Any value less than 6 will result
2503
 
      in a label of minimal size, consisting of an underscore and a
2504
 
      numeric counter. The compiler uses the value of
2505
 
      dialect.max_identifier_length as a default.
2506
 
 
2507
 
    .. change::
2508
 
        :tags: ext
2509
 
        :tickets: 
2510
 
 
2511
 
      Added a new extension sqlalchemy.ext.serializer.  Provides
2512
 
      Serializer/Deserializer "classes" which mirror
2513
 
      Pickle/Unpickle, as well as dumps() and loads(). This
2514
 
      serializer implements an "external object" pickler which keeps
2515
 
      key context-sensitive objects, including engines, sessions,
2516
 
      metadata, Tables/Columns, and mappers, outside of the pickle
2517
 
      stream, and can later restore the pickle using any
2518
 
      engine/metadata/session provider. This is used not for
2519
 
      pickling regular object instances, which are pickleable
2520
 
      without any special logic, but for pickling expression objects
2521
 
      and full Query objects, such that all mapper/engine/session
2522
 
      dependencies can be restored at unpickle time.
2523
 
 
2524
 
    .. change::
2525
 
        :tags: oracle
2526
 
        :tickets: 
2527
 
 
2528
 
      Wrote a docstring for Oracle dialect. Apparently that Ohloh
2529
 
      "few source code comments" label is starting to sting :).
2530
 
 
2531
 
    .. change::
2532
 
        :tags: oracle
2533
 
        :tickets: 536
2534
 
 
2535
 
      Removed FIRST_ROWS() optimize flag when using LIMIT/OFFSET,
2536
 
      can be reenabled with optimize_limits=True create_engine()
2537
 
      flag.
2538
 
 
2539
 
    .. change::
2540
 
        :tags: oracle
2541
 
        :tickets: 
2542
 
 
2543
 
      bugfixes and behavioral changes
2544
 
 
2545
 
    .. change::
2546
 
        :tags: orm
2547
 
        :tickets: 
2548
 
 
2549
 
      "not equals" comparisons of simple many-to-one relation to an
2550
 
      instance will not drop into an EXISTS clause and will compare
2551
 
      foreign key columns instead.
2552
 
 
2553
 
    .. change::
2554
 
        :tags: orm
2555
 
        :tickets: 
2556
 
 
2557
 
      Removed not-really-working use cases of comparing a collection
2558
 
      to an iterable. Use contains() to test for collection
2559
 
      membership.
2560
 
 
2561
 
    .. change::
2562
 
        :tags: orm
2563
 
        :tickets: 1171
2564
 
 
2565
 
      Improved the behavior of aliased() objects such that they more
2566
 
      accurately adapt the expressions generated, which helps
2567
 
      particularly with self-referential comparisons.
2568
 
 
2569
 
    .. change::
2570
 
        :tags: orm
2571
 
        :tickets: 
2572
 
 
2573
 
      Fixed bug involving primaryjoin/secondaryjoin conditions
2574
 
      constructed from class-bound attributes (as often occurs when
2575
 
      using declarative), which later would be inappropriately
2576
 
      aliased by Query, particularly with the various EXISTS based
2577
 
      comparators.
2578
 
 
2579
 
    .. change::
2580
 
        :tags: orm
2581
 
        :tickets: 
2582
 
 
2583
 
      Fixed bug when using multiple query.join() with an
2584
 
      aliased-bound descriptor which would lose the left alias.
2585
 
 
2586
 
    .. change::
2587
 
        :tags: orm
2588
 
        :tickets: 
2589
 
 
2590
 
      Improved weakref identity map memory management to no longer
2591
 
      require mutexing, resurrects garbage collected instance on a
2592
 
      lazy basis for an InstanceState with pending changes.
2593
 
 
2594
 
    .. change::
2595
 
        :tags: orm
2596
 
        :tickets: 
2597
 
 
2598
 
      InstanceState object now removes circular references to itself
2599
 
      upon disposal to keep it outside of cyclic garbage collection.
2600
 
 
2601
 
    .. change::
2602
 
        :tags: orm
2603
 
        :tickets: 
2604
 
 
2605
 
      relation() won't hide unrelated ForeignKey errors inside of
2606
 
      the "please specify primaryjoin" message when determining join
2607
 
      condition.
2608
 
 
2609
 
    .. change::
2610
 
        :tags: orm
2611
 
        :tickets: 1218
2612
 
 
2613
 
      Fixed bug in Query involving order_by() in conjunction with
2614
 
      multiple aliases of the same class (will add tests in)
2615
 
 
2616
 
    .. change::
2617
 
        :tags: orm
2618
 
        :tickets: 
2619
 
 
2620
 
      When using Query.join() with an explicit clause for the ON
2621
 
      clause, the clause will be aliased in terms of the left side
2622
 
      of the join, allowing scenarios like query(Source).
2623
 
      from_self().join((Dest, Source.id==Dest.source_id)) to work
2624
 
      properly.
2625
 
 
2626
 
    .. change::
2627
 
        :tags: orm
2628
 
        :tickets: 
2629
 
 
2630
 
      polymorphic_union() function respects the "key" of each Column
2631
 
      if they differ from the column's name.
2632
 
 
2633
 
    .. change::
2634
 
        :tags: orm
2635
 
        :tickets: 1183
2636
 
 
2637
 
      Repaired support for "passive-deletes" on a many-to-one
2638
 
      relation() with "delete" cascade.
2639
 
 
2640
 
    .. change::
2641
 
        :tags: orm
2642
 
        :tickets: 1213
2643
 
 
2644
 
      Fixed bug in composite types which prevented a primary-key
2645
 
      composite type from being mutated.
2646
 
 
2647
 
    .. change::
2648
 
        :tags: orm
2649
 
        :tickets: 1202
2650
 
 
2651
 
      Added more granularity to internal attribute access, such that
2652
 
      cascade and flush operations will not initialize unloaded
2653
 
      attributes and collections, leaving them intact for a
2654
 
      lazy-load later on. Backref events still initialize attrbutes
2655
 
      and collections for pending instances.
2656
 
 
2657
 
    .. change::
2658
 
        :tags: sql
2659
 
        :tickets: 1212
2660
 
 
2661
 
      Simplified the check for ResultProxy "autoclose without
2662
 
      results" to be based solely on presence of
2663
 
      cursor.description. All the regexp-based guessing about
2664
 
      statements returning rows has been removed.
2665
 
 
2666
 
    .. change::
2667
 
        :tags: sql
2668
 
        :tickets: 1194
2669
 
 
2670
 
      Direct execution of a union() construct will properly set up
2671
 
      result-row processing.
2672
 
 
2673
 
    .. change::
2674
 
        :tags: sql
2675
 
        :tickets: 
2676
 
 
2677
 
      The internal notion of an "OID" or "ROWID" column has been
2678
 
      removed. It's basically not used by any dialect, and the
2679
 
      possibility of its usage with psycopg2's cursor.lastrowid is
2680
 
      basically gone now that INSERT..RETURNING is available.
2681
 
 
2682
 
    .. change::
2683
 
        :tags: sql
2684
 
        :tickets: 
2685
 
 
2686
 
      Removed "default_order_by()" method on all FromClause objects.
2687
 
 
2688
 
    .. change::
2689
 
        :tags: sql
2690
 
        :tickets: 
2691
 
 
2692
 
      Repaired the table.tometadata() method so that a passed-in
2693
 
      schema argument is propagated to ForeignKey constructs.
2694
 
 
2695
 
    .. change::
2696
 
        :tags: sql
2697
 
        :tickets: 
2698
 
 
2699
 
      Slightly changed behavior of IN operator for comparing to
2700
 
      empty collections. Now results in inequality comparison
2701
 
      against self. More portable, but breaks with stored procedures
2702
 
      that aren't pure functions.
2703
 
 
2704
 
    .. change::
2705
 
        :tags: oracle
2706
 
        :tickets: 
2707
 
 
2708
 
      Setting the auto_convert_lobs to False on create_engine() will
2709
 
      also instruct the OracleBinary type to return the cx_oracle
2710
 
      LOB object unchanged.
2711
 
 
2712
 
    .. change::
2713
 
        :tags: mysql
2714
 
        :tickets: 
2715
 
 
2716
 
      Fixed foreign key reflection in the edge case where a Table's
2717
 
      explicit schema= is the same as the schema (database) the
2718
 
      connection is attached to.
2719
 
 
2720
 
    .. change::
2721
 
        :tags: mysql
2722
 
        :tickets: 
2723
 
 
2724
 
      No longer expects include_columns in table reflection to be
2725
 
      lower case.
2726
 
 
2727
 
    .. change::
2728
 
        :tags: ext
2729
 
        :tickets: 1174
2730
 
 
2731
 
      Fixed bug preventing declarative-bound "column" objects from
2732
 
      being used in column_mapped_collection().
2733
 
 
2734
 
    .. change::
2735
 
        :tags: misc
2736
 
        :tickets: 1077
2737
 
 
2738
 
      util.flatten_iterator() func doesn't interpret strings with
2739
 
      __iter__() methods as iterators, such as in pypy.
2740
 
 
2741
 
.. changelog::
2742
 
    :version: 0.5.0rc2
2743
 
    :released: Sun Oct 12 2008
2744
 
 
2745
 
    .. change::
2746
 
        :tags: orm
2747
 
        :tickets: 
2748
 
 
2749
 
      Fixed bug involving read/write relation()s that contain
2750
 
      literal or other non-column expressions within their
2751
 
      primaryjoin condition equated to a foreign key column.
2752
 
 
2753
 
    .. change::
2754
 
        :tags: orm
2755
 
        :tickets: 
2756
 
 
2757
 
      "non-batch" mode in mapper(), a feature which allows mapper
2758
 
      extension methods to be called as each instance is
2759
 
      updated/inserted, now honors the insert order of the objects
2760
 
      given.
2761
 
 
2762
 
    .. change::
2763
 
        :tags: orm
2764
 
        :tickets: 
2765
 
 
2766
 
      Fixed RLock-related bug in mapper which could deadlock upon
2767
 
      reentrant mapper compile() calls, something that occurs when
2768
 
      using declarative constructs inside of ForeignKey objects.
2769
 
 
2770
 
    .. change::
2771
 
        :tags: orm
2772
 
        :tickets: 
2773
 
 
2774
 
      ScopedSession.query_property now accepts a query_cls factory,
2775
 
      overriding the session's configured query_cls.
2776
 
 
2777
 
    .. change::
2778
 
        :tags: orm
2779
 
        :tickets: 
2780
 
 
2781
 
      Fixed shared state bug interfering with ScopedSession.mapper's
2782
 
      ability to apply default __init__ implementations on object
2783
 
      subclasses.
2784
 
 
2785
 
    .. change::
2786
 
        :tags: orm
2787
 
        :tickets: 1177
2788
 
 
2789
 
      Fixed up slices on Query (i.e. query[x:y]) to work properly
2790
 
      for zero length slices, slices with None on either end.
2791
 
 
2792
 
    .. change::
2793
 
        :tags: orm
2794
 
        :tickets: 
2795
 
 
2796
 
      Added an example illustrating Celko's "nested sets" as a
2797
 
      SQLA mapping.
2798
 
 
2799
 
    .. change::
2800
 
        :tags: orm
2801
 
        :tickets: 
2802
 
 
2803
 
      contains_eager() with an alias argument works even when
2804
 
      the alias is embedded in a SELECT, as when sent to the
2805
 
      Query via query.select_from().
2806
 
 
2807
 
    .. change::
2808
 
        :tags: orm
2809
 
        :tickets: 1180
2810
 
 
2811
 
      contains_eager() usage is now compatible with a Query that
2812
 
      also contains a regular eager load and limit/offset, in that
2813
 
      the columns are added to the Query-generated subquery.
2814
 
 
2815
 
    .. change::
2816
 
        :tags: orm
2817
 
        :tickets: 
2818
 
 
2819
 
      session.execute() will execute a Sequence object passed to
2820
 
      it (regression from 0.4).
2821
 
 
2822
 
    .. change::
2823
 
        :tags: orm
2824
 
        :tickets: 
2825
 
 
2826
 
      Removed the "raiseerror" keyword argument from object_mapper()
2827
 
      and class_mapper().  These functions raise in all cases
2828
 
      if the given class/instance is not mapped.
2829
 
 
2830
 
    .. change::
2831
 
        :tags: orm
2832
 
        :tickets: 
2833
 
 
2834
 
      Fixed session.transaction.commit() on a autocommit=False
2835
 
      session not starting a new transaction.
2836
 
 
2837
 
    .. change::
2838
 
        :tags: orm
2839
 
        :tickets: 
2840
 
 
2841
 
      Some adjustments to Session.identity_map's weak referencing
2842
 
      behavior to reduce asynchronous GC side effects.
2843
 
 
2844
 
    .. change::
2845
 
        :tags: orm
2846
 
        :tickets: 1182
2847
 
 
2848
 
      Adjustment to Session's post-flush accounting of newly
2849
 
      "clean" objects to better protect against operating on
2850
 
      objects as they're asynchronously gc'ed.
2851
 
 
2852
 
    .. change::
2853
 
        :tags: sql
2854
 
        :tickets: 1074
2855
 
 
2856
 
      column.in_(someselect) can now be used as a columns-clause
2857
 
      expression without the subquery bleeding into the FROM clause
2858
 
 
2859
 
    .. change::
2860
 
        :tags: sqlite
2861
 
        :tickets: 968
2862
 
 
2863
 
      Overhauled SQLite date/time bind/result processing to use
2864
 
      regular expressions and format strings, rather than
2865
 
      strptime/strftime, to generically support pre-1900 dates,
2866
 
      dates with microseconds.
2867
 
 
2868
 
    .. change::
2869
 
        :tags: sqlite
2870
 
        :tickets: 
2871
 
 
2872
 
      String's (and Unicode's, UnicodeText's, etc.) convert_unicode
2873
 
      logic disabled in the sqlite dialect, to adjust for pysqlite
2874
 
      2.5.0's new requirement that only Python unicode objects are
2875
 
      accepted;
2876
 
      http://itsystementwicklung.de/pipermail/list-pysqlite/2008-March/000018.html
2877
 
 
2878
 
    .. change::
2879
 
        :tags: mysql
2880
 
        :tickets: 
2881
 
 
2882
 
      Temporary tables are now reflectable.
2883
 
 
2884
 
    .. change::
2885
 
        :tags: oracle
2886
 
        :tickets: 1187
2887
 
 
2888
 
      Oracle will detect string-based statements which contain
2889
 
      comments at the front before a SELECT as SELECT statements.
2890
 
 
2891
 
.. changelog::
2892
 
    :version: 0.5.0rc1
2893
 
    :released: Thu Sep 11 2008
2894
 
 
2895
 
    .. change::
2896
 
        :tags: orm
2897
 
        :tickets: 
2898
 
 
2899
 
      Query now has delete() and update(values) methods. This allows
2900
 
      to perform bulk deletes/updates with the Query object.
2901
 
 
2902
 
    .. change::
2903
 
        :tags: orm
2904
 
        :tickets: 
2905
 
 
2906
 
      The RowTuple object returned by Query(\*cols) now features
2907
 
      keynames which prefer mapped attribute names over column keys,
2908
 
      column keys over column names, i.e.  Query(Class.foo,
2909
 
      Class.bar) will have names "foo" and "bar" even if those are
2910
 
      not the names of the underlying Column objects.  Direct Column
2911
 
      objects such as Query(table.c.col) will return the "key"
2912
 
      attribute of the Column.
2913
 
 
2914
 
    .. change::
2915
 
        :tags: orm
2916
 
        :tickets: 
2917
 
 
2918
 
      Added scalar() and value() methods to Query, each return a
2919
 
      single scalar value.  scalar() takes no arguments and is
2920
 
      roughly equivalent to first()[0], value()
2921
 
      takes a single column expression and is roughly equivalent to
2922
 
      values(expr).next()[0].
2923
 
 
2924
 
    .. change::
2925
 
        :tags: orm
2926
 
        :tickets: 
2927
 
 
2928
 
      Improved the determination of the FROM clause when placing SQL
2929
 
      expressions in the query() list of entities.  In particular
2930
 
      scalar subqueries should not "leak" their inner FROM objects
2931
 
      out into the enclosing query.
2932
 
 
2933
 
    .. change::
2934
 
        :tags: orm
2935
 
        :tickets: 
2936
 
 
2937
 
      Joins along a relation() from a mapped class to a mapped
2938
 
      subclass, where the mapped subclass is configured with single
2939
 
      table inheritance, will include an IN clause which limits the
2940
 
      subtypes of the joined class to those requested, within the ON
2941
 
      clause of the join.  This takes effect for eager load joins as
2942
 
      well as query.join().  Note that in some scenarios the IN
2943
 
      clause will appear in the WHERE clause of the query as well
2944
 
      since this discrimination has multiple trigger points.
2945
 
 
2946
 
    .. change::
2947
 
        :tags: orm
2948
 
        :tickets: 
2949
 
 
2950
 
      AttributeExtension has been refined such that the event
2951
 
      is fired before the mutation actually occurs.  Additionally,
2952
 
      the append() and set() methods must now return the given value,
2953
 
      which is used as the value to be used in the mutation operation.
2954
 
      This allows creation of validating AttributeListeners which
2955
 
      raise before the action actually occurs, and which can change
2956
 
      the given value into something else before its used.
2957
 
 
2958
 
    .. change::
2959
 
        :tags: orm
2960
 
        :tickets: 
2961
 
 
2962
 
      column_property(), composite_property(), and relation() now
2963
 
      accept a single or list of AttributeExtensions using the
2964
 
      "extension" keyword argument.
2965
 
 
2966
 
    .. change::
2967
 
        :tags: orm
2968
 
        :tickets: 
2969
 
 
2970
 
      query.order_by().get() silently drops the "ORDER BY" from
2971
 
      the query issued by GET but does not raise an exception.
2972
 
 
2973
 
    .. change::
2974
 
        :tags: orm
2975
 
        :tickets: 
2976
 
 
2977
 
      Added a Validator AttributeExtension, as well as a
2978
 
      @validates decorator which is used in a similar fashion
2979
 
      as @reconstructor, and marks a method as validating
2980
 
      one or more mapped attributes.
2981
 
 
2982
 
    .. change::
2983
 
        :tags: orm
2984
 
        :tickets: 1140
2985
 
 
2986
 
      class.someprop.in_() raises NotImplementedError pending the
2987
 
      implementation of "in\_" for relation
2988
 
 
2989
 
    .. change::
2990
 
        :tags: orm
2991
 
        :tickets: 1127
2992
 
 
2993
 
      Fixed primary key update for many-to-many collections where
2994
 
      the collection had not been loaded yet
2995
 
 
2996
 
    .. change::
2997
 
        :tags: orm
2998
 
        :tickets: 
2999
 
 
3000
 
      Fixed bug whereby deferred() columns with a group in conjunction
3001
 
      with an otherwise unrelated synonym() would produce
3002
 
      an AttributeError during deferred load.
3003
 
 
3004
 
    .. change::
3005
 
        :tags: orm
3006
 
        :tickets: 1128
3007
 
 
3008
 
      The before_flush() hook on SessionExtension takes place before
3009
 
      the list of new/dirty/deleted is calculated for the final
3010
 
      time, allowing routines within before_flush() to further
3011
 
      change the state of the Session before the flush proceeds.
3012
 
 
3013
 
    .. change::
3014
 
        :tags: orm
3015
 
        :tickets: 
3016
 
 
3017
 
      The "extension" argument to Session and others can now
3018
 
      optionally be a list, supporting events sent to multiple
3019
 
      SessionExtension instances.  Session places SessionExtensions
3020
 
      in Session.extensions.
3021
 
 
3022
 
    .. change::
3023
 
        :tags: orm
3024
 
        :tickets: 
3025
 
 
3026
 
      Reentrant calls to flush() raise an error.  This also serves
3027
 
      as a rudimentary, but not foolproof, check against concurrent
3028
 
      calls to Session.flush().
3029
 
 
3030
 
    .. change::
3031
 
        :tags: orm
3032
 
        :tickets: 
3033
 
 
3034
 
      Improved the behavior of query.join() when joining to
3035
 
      joined-table inheritance subclasses, using explicit join
3036
 
      criteria (i.e. not on a relation).
3037
 
 
3038
 
    .. change::
3039
 
        :tags: orm
3040
 
        :tickets: 
3041
 
 
3042
 
      @orm.attributes.reconstitute and
3043
 
      MapperExtension.reconstitute have been renamed to
3044
 
      @orm.reconstructor and MapperExtension.reconstruct_instance
3045
 
 
3046
 
    .. change::
3047
 
        :tags: orm
3048
 
        :tickets: 1129
3049
 
 
3050
 
      Fixed @reconstructor hook for subclasses which inherit from a
3051
 
      base class.
3052
 
 
3053
 
    .. change::
3054
 
        :tags: orm
3055
 
        :tickets: 1132
3056
 
 
3057
 
      The composite() property type now supports a
3058
 
      __set_composite_values__() method on the composite class which
3059
 
      is required if the class represents state using attribute
3060
 
      names other than the column's keynames; default-generated
3061
 
      values now get populated properly upon flush.  Also,
3062
 
      composites with attributes set to None compare correctly.
3063
 
 
3064
 
    .. change::
3065
 
        :tags: orm
3066
 
        :tickets: 
3067
 
 
3068
 
      The 3-tuple of iterables returned by attributes.get_history()
3069
 
      may now be a mix of lists and tuples.  (Previously members
3070
 
      were always lists.)
3071
 
 
3072
 
    .. change::
3073
 
        :tags: orm
3074
 
        :tickets: 1151
3075
 
 
3076
 
      Fixed bug whereby changing a primary key attribute on an
3077
 
      entity where the attribute's previous value had been expired
3078
 
      would produce an error upon flush().
3079
 
 
3080
 
    .. change::
3081
 
        :tags: orm
3082
 
        :tickets: 
3083
 
 
3084
 
      Fixed custom instrumentation bug whereby get_instance_dict()
3085
 
      was not called for newly constructed instances not loaded
3086
 
      by the ORM.
3087
 
 
3088
 
    .. change::
3089
 
        :tags: orm
3090
 
        :tickets: 1150
3091
 
 
3092
 
      Session.delete() adds the given object to the session if
3093
 
      not already present.  This was a regression bug from 0.4.
3094
 
 
3095
 
    .. change::
3096
 
        :tags: orm
3097
 
        :tickets: 
3098
 
 
3099
 
      The `echo_uow` flag on `Session` is deprecated, and unit-of-work
3100
 
      logging is now application-level only, not per-session level.
3101
 
 
3102
 
    .. change::
3103
 
        :tags: orm
3104
 
        :tickets: 1153
3105
 
 
3106
 
      Removed conflicting `contains()` operator from
3107
 
      `InstrumentedAttribute` which didn't accept `escape` kwaarg.
3108
 
 
3109
 
    .. change::
3110
 
        :tags: declarative
3111
 
        :tickets: 1161
3112
 
 
3113
 
      Fixed bug whereby mapper couldn't initialize if a composite
3114
 
      primary key referenced another table that was not defined
3115
 
      yet.
3116
 
 
3117
 
    .. change::
3118
 
        :tags: declarative
3119
 
        :tickets: 
3120
 
 
3121
 
      Fixed exception throw which would occur when string-based
3122
 
      primaryjoin condition was used in conjunction with backref.
3123
 
 
3124
 
    .. change::
3125
 
        :tags: schema
3126
 
        :tickets: 1033
3127
 
 
3128
 
      Added "sorted_tables" accessor to MetaData, which returns
3129
 
      Table objects sorted in order of dependency as a list.
3130
 
      This deprecates the MetaData.table_iterator() method.
3131
 
      The "reverse=False" keyword argument has also been
3132
 
      removed from util.sort_tables(); use the Python
3133
 
      'reversed' function to reverse the results.
3134
 
 
3135
 
    .. change::
3136
 
        :tags: schema
3137
 
        :tickets: 
3138
 
 
3139
 
      The 'length' argument to all Numeric types has been renamed
3140
 
      to 'scale'.  'length' is deprecated and is still accepted
3141
 
      with a warning.
3142
 
 
3143
 
    .. change::
3144
 
        :tags: schema
3145
 
        :tickets: 
3146
 
 
3147
 
      Dropped 0.3-compatibility for user defined types
3148
 
      (convert_result_value, convert_bind_param).
3149
 
 
3150
 
    .. change::
3151
 
        :tags: sql
3152
 
        :tickets: 1068
3153
 
 
3154
 
      Temporarily rolled back the "ORDER BY" enhancement from.  This feature is on hold pending further
3155
 
      development.
3156
 
 
3157
 
    .. change::
3158
 
        :tags: sql
3159
 
        :tickets: 
3160
 
 
3161
 
      The exists() construct won't "export" its contained list
3162
 
      of elements as FROM clauses, allowing them to be used more
3163
 
      effectively in the columns clause of a SELECT.
3164
 
 
3165
 
    .. change::
3166
 
        :tags: sql
3167
 
        :tickets: 798
3168
 
 
3169
 
      and_() and or_() now generate a ColumnElement, allowing
3170
 
      boolean expressions as result columns, i.e.
3171
 
      select([and_(1, 0)]).
3172
 
 
3173
 
    .. change::
3174
 
        :tags: sql
3175
 
        :tickets: 
3176
 
 
3177
 
      Bind params now subclass ColumnElement which allows them to be
3178
 
      selectable by orm.query (they already had most ColumnElement
3179
 
      semantics).
3180
 
 
3181
 
    .. change::
3182
 
        :tags: sql
3183
 
        :tickets: 
3184
 
 
3185
 
      Added select_from() method to exists() construct, which becomes
3186
 
      more and more compatible with a regular select().
3187
 
 
3188
 
    .. change::
3189
 
        :tags: sql
3190
 
        :tickets: 1160
3191
 
 
3192
 
      Added func.min(), func.max(), func.sum() as "generic functions",
3193
 
      which basically allows for their return type to be determined
3194
 
      automatically.  Helps with dates on SQLite, decimal types,
3195
 
      others.
3196
 
 
3197
 
    .. change::
3198
 
        :tags: sql
3199
 
        :tickets: 
3200
 
 
3201
 
      added decimal.Decimal as an "auto-detect" type; bind parameters
3202
 
      and generic functions will set their type to Numeric when a
3203
 
      Decimal is used.
3204
 
 
3205
 
    .. change::
3206
 
        :tags: mysql
3207
 
        :tickets: 
3208
 
 
3209
 
      The 'length' argument to MSInteger, MSBigInteger, MSTinyInteger,
3210
 
      MSSmallInteger and MSYear has been renamed to 'display_width'.
3211
 
 
3212
 
    .. change::
3213
 
        :tags: mysql
3214
 
        :tickets: 1146
3215
 
 
3216
 
      Added MSMediumInteger type.
3217
 
 
3218
 
    .. change::
3219
 
        :tags: mysql
3220
 
        :tickets: 
3221
 
 
3222
 
      the function func.utc_timestamp() compiles to UTC_TIMESTAMP, without
3223
 
      the parenthesis, which seem to get in the way when using in
3224
 
      conjunction with executemany().
3225
 
 
3226
 
    .. change::
3227
 
        :tags: oracle
3228
 
        :tickets: 536
3229
 
 
3230
 
      limit/offset no longer uses ROW NUMBER OVER to limit rows,
3231
 
      and instead uses subqueries in conjunction with a special
3232
 
      Oracle optimization comment.  Allows LIMIT/OFFSET to work
3233
 
      in conjunction with DISTINCT.
3234
 
 
3235
 
    .. change::
3236
 
        :tags: oracle
3237
 
        :tickets: 1155
3238
 
 
3239
 
      has_sequence() now takes the current "schema" argument into
3240
 
      account
3241
 
 
3242
 
    .. change::
3243
 
        :tags: oracle
3244
 
        :tickets: 1121
3245
 
 
3246
 
      added BFILE to reflected type names
3247
 
 
3248
 
.. changelog::
3249
 
    :version: 0.5.0beta3
3250
 
    :released: Mon Aug 04 2008
3251
 
 
3252
 
    .. change::
3253
 
        :tags: orm
3254
 
        :tickets: 
3255
 
 
3256
 
      The "entity_name" feature of SQLAlchemy mappers has been
3257
 
      removed.  For rationale, see http://tinyurl.com/6nm2ne
3258
 
 
3259
 
    .. change::
3260
 
        :tags: orm
3261
 
        :tickets: 
3262
 
 
3263
 
      the "autoexpire" flag on Session, sessionmaker(), and
3264
 
      scoped_session() has been renamed to "expire_on_commit".  It
3265
 
      does not affect the expiration behavior of rollback().
3266
 
 
3267
 
    .. change::
3268
 
        :tags: orm
3269
 
        :tickets: 
3270
 
 
3271
 
      fixed endless loop bug which could occur within a mapper's
3272
 
      deferred load of inherited attributes.
3273
 
 
3274
 
    .. change::
3275
 
        :tags: orm
3276
 
        :tickets: 
3277
 
 
3278
 
      a legacy-support flag "_enable_transaction_accounting" flag
3279
 
      added to Session which when False, disables all
3280
 
      transaction-level object accounting, including expire on
3281
 
      rollback, expire on commit, new/deleted list maintenance, and
3282
 
      autoflush on begin.
3283
 
 
3284
 
    .. change::
3285
 
        :tags: orm
3286
 
        :tickets: 
3287
 
 
3288
 
      The 'cascade' parameter to relation() accepts None as a value,
3289
 
      which is equivalent to no cascades.
3290
 
 
3291
 
    .. change::
3292
 
        :tags: orm
3293
 
        :tickets: 
3294
 
 
3295
 
      A critical fix to dynamic relations allows the "modified"
3296
 
      history to be properly cleared after a flush().
3297
 
 
3298
 
    .. change::
3299
 
        :tags: orm
3300
 
        :tickets: 
3301
 
 
3302
 
      user-defined @properties on a class are detected and left in
3303
 
      place during mapper initialization.  This means that a
3304
 
      table-bound column of the same name will not be mapped at all
3305
 
      if a @property is in the way (and the column is not remapped
3306
 
      to a different name), nor will an instrumented attribute from
3307
 
      an inherited class be applied.  The same rules apply for names
3308
 
      excluded using the include_properties/exclude_properties
3309
 
      collections.
3310
 
 
3311
 
    .. change::
3312
 
        :tags: orm
3313
 
        :tickets: 
3314
 
 
3315
 
      Added a new SessionExtension hook called after_attach().  This
3316
 
      is called at the point of attachment for objects via add(),
3317
 
      add_all(), delete(), and merge().
3318
 
 
3319
 
    .. change::
3320
 
        :tags: orm
3321
 
        :tickets: 1111
3322
 
 
3323
 
      A mapper which inherits from another, when inheriting the
3324
 
      columns of its inherited mapper, will use any reassigned
3325
 
      property names specified in that inheriting mapper.
3326
 
      Previously, if "Base" had reassigned "base_id" to the name
3327
 
      "id", "SubBase(Base)" would still get an attribute called
3328
 
      "base_id".  This could be worked around by explicitly stating
3329
 
      the column in each submapper as well but this is fairly
3330
 
      unworkable and also impossible when using declarative.
3331
 
 
3332
 
    .. change::
3333
 
        :tags: orm
3334
 
        :tickets: 
3335
 
 
3336
 
      Fixed a series of potential race conditions in Session whereby
3337
 
      asynchronous GC could remove unmodified, no longer referenced
3338
 
      items from the session as they were present in a list of items
3339
 
      to be processed, typically during session.expunge_all() and
3340
 
      dependent methods.
3341
 
 
3342
 
    .. change::
3343
 
        :tags: orm
3344
 
        :tickets: 
3345
 
 
3346
 
      Some improvements to the _CompileOnAttr mechanism which should
3347
 
      reduce the probability of "Attribute x was not replaced during
3348
 
      compile" warnings. (this generally applies to SQLA hackers,
3349
 
      like Elixir devs).
3350
 
 
3351
 
    .. change::
3352
 
        :tags: orm
3353
 
        :tickets: 
3354
 
 
3355
 
      Fixed bug whereby the "unsaved, pending instance" FlushError
3356
 
      raised for a pending orphan would not take superclass mappers
3357
 
      into account when generating the list of relations responsible
3358
 
      for the error.
3359
 
 
3360
 
    .. change::
3361
 
        :tags: sql
3362
 
        :tickets: 
3363
 
 
3364
 
      func.count() with no arguments renders as COUNT(*), equivalent
3365
 
      to func.count(text('*')).
3366
 
 
3367
 
    .. change::
3368
 
        :tags: sql
3369
 
        :tickets: 1068
3370
 
 
3371
 
      simple label names in ORDER BY expressions render as
3372
 
      themselves, and not as a re-statement of their corresponding
3373
 
      expression.  This feature is currently enabled only for
3374
 
      SQLite, MySQL, and PostgreSQL.  It can be enabled on other
3375
 
      dialects as each is shown to support this
3376
 
      behavior.
3377
 
 
3378
 
    .. change::
3379
 
        :tags: ext
3380
 
        :tickets: 
3381
 
 
3382
 
      Class-bound attributes sent as arguments to relation()'s
3383
 
      remote_side and foreign_keys parameters are now accepted,
3384
 
      allowing them to be used with declarative.  Additionally fixed
3385
 
      bugs involving order_by being specified as a class-bound
3386
 
      attribute in conjunction with eager loading.
3387
 
 
3388
 
    .. change::
3389
 
        :tags: ext
3390
 
        :tickets: 
3391
 
 
3392
 
      declarative initialization of Columns adjusted so that
3393
 
      non-renamed columns initialize in the same way as a non
3394
 
      declarative mapper.  This allows an inheriting mapper to set
3395
 
      up its same-named "id" columns in particular such that the
3396
 
      parent "id" column is favored over the child column, reducing
3397
 
      database round trips when this value is requested.
3398
 
 
3399
 
    .. change::
3400
 
        :tags: mysql
3401
 
        :tickets: 1110
3402
 
 
3403
 
      Quoting of MSEnum values for use in CREATE TABLE is now
3404
 
      optional & will be quoted on demand as required.  (Quoting was
3405
 
      always optional for use with existing tables.)
3406
 
 
3407
 
.. changelog::
3408
 
    :version: 0.5.0beta2
3409
 
    :released: Mon Jul 14 2008
3410
 
 
3411
 
    .. change::
3412
 
        :tags: orm
3413
 
        :tickets: 870
3414
 
 
3415
 
      In addition to expired attributes, deferred attributes also
3416
 
      load if their data is present in the result set.
3417
 
 
3418
 
    .. change::
3419
 
        :tags: orm
3420
 
        :tickets: 
3421
 
 
3422
 
      session.refresh() raises an informative error message if the
3423
 
      list of attributes does not include any column-based
3424
 
      attributes.
3425
 
 
3426
 
    .. change::
3427
 
        :tags: orm
3428
 
        :tickets: 
3429
 
 
3430
 
      query() raises an informative error message if no columns or
3431
 
      mappers are specified.
3432
 
 
3433
 
    .. change::
3434
 
        :tags: orm
3435
 
        :tickets: 
3436
 
 
3437
 
      lazy loaders now trigger autoflush before proceeding.  This
3438
 
      allows expire() of a collection or scalar relation to function
3439
 
      properly in the context of autoflush.
3440
 
 
3441
 
    .. change::
3442
 
        :tags: orm
3443
 
        :tickets: 887
3444
 
 
3445
 
      column_property() attributes which represent SQL expressions
3446
 
      or columns that are not present in the mapped tables (such as
3447
 
      those from views) are automatically expired after an INSERT or
3448
 
      UPDATE, assuming they have not been locally modified, so that
3449
 
      they are refreshed with the most recent data upon access.
3450
 
 
3451
 
    .. change::
3452
 
        :tags: orm
3453
 
        :tickets: 1082
3454
 
 
3455
 
      Fixed explicit, self-referential joins between two
3456
 
      joined-table inheritance mappers when using query.join(cls,
3457
 
      aliased=True).
3458
 
 
3459
 
    .. change::
3460
 
        :tags: orm
3461
 
        :tickets: 
3462
 
 
3463
 
      Fixed query.join() when used in conjunction with a
3464
 
      columns-only clause and an SQL-expression ON clause in the
3465
 
      join.
3466
 
 
3467
 
    .. change::
3468
 
        :tags: orm
3469
 
        :tickets: 
3470
 
 
3471
 
      The "allow_column_override" flag from mapper() has been
3472
 
      removed.  This flag is virtually always misunderstood.  Its
3473
 
      specific functionality is available via the
3474
 
      include_properties/exclude_properties mapper arguments.
3475
 
 
3476
 
    .. change::
3477
 
        :tags: orm
3478
 
        :tickets: 1066
3479
 
 
3480
 
      Repaired `__str__()` method on Query.
3481
 
 
3482
 
    .. change::
3483
 
        :tags: orm
3484
 
        :tickets: 
3485
 
 
3486
 
      Session.bind gets used as a default even when table/mapper
3487
 
      specific binds are defined.
3488
 
 
3489
 
    .. change::
3490
 
        :tags: schema
3491
 
        :tickets: 1075
3492
 
 
3493
 
      Added prefixes option to `Table` that accepts a list of
3494
 
      strings to insert after CREATE in the CREATE TABLE statement.
3495
 
 
3496
 
    .. change::
3497
 
        :tags: schema
3498
 
        :tickets: 
3499
 
 
3500
 
      Unicode, UnicodeText types now set "assert_unicode" and
3501
 
      "convert_unicode" by default, but accept overriding
3502
 
      \**kwargs for these values.
3503
 
 
3504
 
    .. change::
3505
 
        :tags: sql
3506
 
        :tickets: 
3507
 
 
3508
 
      Added new match() operator that performs a full-text search.
3509
 
      Supported on PostgreSQL, SQLite, MySQL, MS-SQL, and Oracle
3510
 
      backends.
3511
 
 
3512
 
    .. change::
3513
 
        :tags: sqlite
3514
 
        :tickets: 1090
3515
 
 
3516
 
      Modified SQLite's representation of "microseconds" to match
3517
 
      the output of str(somedatetime), i.e. in that the microseconds
3518
 
      are represented as fractional seconds in string format.  This
3519
 
      makes SQLA's SQLite date type compatible with datetimes that
3520
 
      were saved directly using Pysqlite (which just calls str()).
3521
 
      Note that this is incompatible with the existing microseconds
3522
 
      values in a SQLA 0.4 generated SQLite database file.
3523
 
      
3524
 
      To get the old behavior globally:
3525
 
      
3526
 
           from sqlalchemy.databases.sqlite import DateTimeMixin
3527
 
           DateTimeMixin.__legacy_microseconds__ = True
3528
 
      
3529
 
      To get the behavior on individual DateTime types:
3530
 
      
3531
 
            t = sqlite.SLDateTime()
3532
 
            t.__legacy_microseconds__ = True
3533
 
      
3534
 
      Then use "t" as the type on the Column.
3535
 
 
3536
 
    .. change::
3537
 
        :tags: sqlite
3538
 
        :tickets: 
3539
 
 
3540
 
      SQLite Date, DateTime, and Time types only accept Python
3541
 
      datetime objects now, not strings.  If you'd like to format
3542
 
      dates as strings yourself with SQLite, use a String type.  If
3543
 
      you'd like them to return datetime objects anyway despite
3544
 
      their accepting strings as input, make a TypeDecorator around
3545
 
      String - SQLA doesn't encourage this pattern.
3546
 
 
3547
 
    .. change::
3548
 
        :tags: extensions
3549
 
        :tickets: 1096
3550
 
 
3551
 
      Declarative supports a __table_args__ class variable, which is
3552
 
      either a dictionary, or tuple of the form (arg1, arg2, ...,
3553
 
      {kwarg1:value, ...}) which contains positional + kw arguments
3554
 
      to be passed to the Table constructor.
3555
 
 
3556
 
.. changelog::
3557
 
    :version: 0.5.0beta1
3558
 
    :released: Thu Jun 12 2008
3559
 
 
3560
 
    .. change::
3561
 
        :tags: 
3562
 
        :tickets: 
3563
 
 
3564
 
      The "__init__" trigger/decorator added by mapper now attempts
3565
 
      to exactly mirror the argument signature of the original
3566
 
      __init__.  The pass-through for '_sa_session' is no longer
3567
 
      implicit- you must allow for this keyword argument in your
3568
 
      constructor.
3569
 
 
3570
 
    .. change::
3571
 
        :tags: 
3572
 
        :tickets: 
3573
 
 
3574
 
      ClassState is renamed to ClassManager.
3575
 
 
3576
 
    .. change::
3577
 
        :tags: 
3578
 
        :tickets: 
3579
 
 
3580
 
      Classes may supply their own InstrumentationManager by
3581
 
      providing a __sa_instrumentation_manager__ property.
3582
 
 
3583
 
    .. change::
3584
 
        :tags: 
3585
 
        :tickets: 
3586
 
 
3587
 
      Custom instrumentation may use any mechanism to associate a
3588
 
      ClassManager with a class and an InstanceState with an
3589
 
      instance.  Attributes on those objects are still the default
3590
 
      association mechanism used by SQLAlchemy's native
3591
 
      instrumentation.
3592
 
 
3593
 
    .. change::
3594
 
        :tags: 
3595
 
        :tickets: 
3596
 
 
3597
 
      Moved entity_name, _sa_session_id, and _instance_key from the
3598
 
      instance object to the instance state.  These values are still
3599
 
      available in the old way, which is now deprecated, using
3600
 
      descriptors attached to the class.  A deprecation warning will
3601
 
      be issued when accessed.
3602
 
 
3603
 
    .. change::
3604
 
        :tags: 
3605
 
        :tickets: 
3606
 
 
3607
 
      The _prepare_instrumentation alias for prepare_instrumentation
3608
 
      has been removed.
3609
 
 
3610
 
    .. change::
3611
 
        :tags: 
3612
 
        :tickets: 
3613
 
 
3614
 
      sqlalchemy.exceptions has been renamed to sqlalchemy.exc.  The
3615
 
      module may be imported under either name.
3616
 
 
3617
 
    .. change::
3618
 
        :tags: 
3619
 
        :tickets: 
3620
 
 
3621
 
      ORM-related exceptions are now defined in sqlalchemy.orm.exc.
3622
 
      ConcurrentModificationError, FlushError, and
3623
 
      UnmappedColumnError compatibility aliases are installed in
3624
 
      sqlalchemy.exc during the import of sqlalchemy.orm.
3625
 
 
3626
 
    .. change::
3627
 
        :tags: 
3628
 
        :tickets: 
3629
 
 
3630
 
      sqlalchemy.logging has been renamed to sqlalchemy.log.
3631
 
 
3632
 
    .. change::
3633
 
        :tags: 
3634
 
        :tickets: 
3635
 
 
3636
 
      The transitional sqlalchemy.log.SADeprecationWarning alias for
3637
 
      the warning's definition in sqlalchemy.exc has been removed.
3638
 
 
3639
 
    .. change::
3640
 
        :tags: 
3641
 
        :tickets: 
3642
 
 
3643
 
      exc.AssertionError has been removed and usage replaced with
3644
 
      Python's built-in AssertionError.
3645
 
 
3646
 
    .. change::
3647
 
        :tags: 
3648
 
        :tickets: 
3649
 
 
3650
 
      The behavior of MapperExtensions attached to multiple,
3651
 
      entity_name= primary mappers for a single class has been
3652
 
      altered.  The first mapper() defined for a class is the only
3653
 
      mapper eligible for the MapperExtension 'instrument_class',
3654
 
      'init_instance' and 'init_failed' events.  This is backwards
3655
 
      incompatible; previously the extensions of last mapper defined
3656
 
      would receive these events.
3657
 
 
3658
 
    .. change::
3659
 
        :tags: firebird
3660
 
        :tickets: 
3661
 
 
3662
 
      Added support for returning values from inserts (2.0+ only),
3663
 
      updates and deletes (2.1+ only).
3664
 
 
3665
 
    .. change::
3666
 
        :tags: general
3667
 
        :tickets: 
3668
 
 
3669
 
      global "propigate"->"propagate" change.
3670
 
 
3671
 
    .. change::
3672
 
        :tags: orm
3673
 
        :tickets: 
3674
 
 
3675
 
      polymorphic_union() function respects the "key" of each
3676
 
      Column if they differ from the column's name.
3677
 
 
3678
 
    .. change::
3679
 
        :tags: orm
3680
 
        :tickets: 1199
3681
 
 
3682
 
      Fixed 0.4-only bug preventing composite columns
3683
 
      from working properly with inheriting mappers
3684
 
 
3685
 
    .. change::
3686
 
        :tags: orm
3687
 
        :tickets: 
3688
 
 
3689
 
      Fixed RLock-related bug in mapper which could deadlock upon
3690
 
      reentrant mapper compile() calls, something that occurs when
3691
 
      using declarative constructs inside of ForeignKey objects.
3692
 
      Ported from 0.5.
3693
 
 
3694
 
    .. change::
3695
 
        :tags: orm
3696
 
        :tickets: 1213
3697
 
 
3698
 
      Fixed bug in composite types which prevented a primary-key
3699
 
      composite type from being mutated.
3700
 
 
3701
 
    .. change::
3702
 
        :tags: orm
3703
 
        :tickets: 976
3704
 
 
3705
 
      Added ScopedSession.is_active accessor.
3706
 
 
3707
 
    .. change::
3708
 
        :tags: orm
3709
 
        :tickets: 939
3710
 
 
3711
 
      Class-bound accessor can be used as the argument to
3712
 
      relation() order_by.
3713
 
 
3714
 
    .. change::
3715
 
        :tags: orm
3716
 
        :tickets: 1072
3717
 
 
3718
 
      Fixed shard_id argument on ShardedSession.execute().
3719
 
 
3720
 
    .. change::
3721
 
        :tags: sql
3722
 
        :tickets: 1246
3723
 
 
3724
 
      Connection.invalidate() checks for closed status
3725
 
      to avoid attribute errors.
3726
 
 
3727
 
    .. change::
3728
 
        :tags: sql
3729
 
        :tickets: 1094
3730
 
 
3731
 
      NullPool supports reconnect on failure behavior.
3732
 
 
3733
 
    .. change::
3734
 
        :tags: sql
3735
 
        :tickets: 1299
3736
 
 
3737
 
      The per-dialect cache used by TypeEngine to cache
3738
 
      dialect-specific types is now a WeakKeyDictionary.
3739
 
      This to prevent dialect objects from
3740
 
      being referenced forever for an application that
3741
 
      creates an arbitrarily large number of engines
3742
 
      or dialects.   There is a small performance penalty
3743
 
      which will be resolved in 0.6.
3744
 
 
3745
 
    .. change::
3746
 
        :tags: sql
3747
 
        :tickets: 
3748
 
 
3749
 
      Fixed SQLite reflection methods so that non-present
3750
 
      cursor.description, which triggers an auto-cursor
3751
 
      close, will be detected so that no results doesn't
3752
 
      fail on recent versions of pysqlite which raise
3753
 
      an error when fetchone() called with no rows present.
3754
 
 
3755
 
    .. change::
3756
 
        :tags: postgres
3757
 
        :tickets: 714
3758
 
 
3759
 
      Added Index reflection support to Postgres, using a
3760
 
      great patch we long neglected, submitted by
3761
 
      Ken Kuhlman.
3762
 
 
3763
 
    .. change::
3764
 
        :tags: mysql
3765
 
        :tickets: 1241
3766
 
 
3767
 
      Fixed bug in exception raise when FK columns not present
3768
 
      during reflection.
3769
 
 
3770
 
    .. change::
3771
 
        :tags: oracle
3772
 
        :tickets: 1265
3773
 
 
3774
 
      Fixed bug which was preventing out params of certain types
3775
 
      from being received; thanks a ton to huddlej at wwu.edu !