From 6010afb28f95c7050ca48ddd2e6f65ca6cbae5a1 Mon Sep 17 00:00:00 2001 From: Michael Trier Date: Tue, 31 Mar 2009 22:31:08 +0000 Subject: [PATCH] Lots of fixes to the code examples to specify imports explicitly. Explicit imports make it easier for users to understand the examples. Additionally a lot of the examples were fixed to work with the changes in the 0.5.x code base. One small correction to the Case expression. Thanks a bunch to Adam Lowry! Fixes #717. --- examples/association/basic_association.py | 19 ++++++++-------- examples/association/proxied_association.py | 7 +++--- examples/collections/large_collection.py | 14 +++++++----- .../custom_attributes/custom_management.py | 12 +++++----- .../custom_attributes/listen_for_events.py | 6 ++--- examples/derived_attributes/attributes.py | 10 ++++----- examples/dynamic_dict/dynamic_dict.py | 4 ++-- examples/elementtree/adjacency_list.py | 12 +++++----- examples/elementtree/optimized_al.py | 12 +++++----- examples/elementtree/pickle.py | 11 +++++----- examples/graphs/graph1.py | 8 +++---- examples/nested_sets/nested_sets.py | 6 ++--- examples/pickle/custom_pickler.py | 11 +++++----- examples/poly_assoc/poly_assoc.py | 11 +++++----- examples/poly_assoc/poly_assoc_fk.py | 10 ++++----- examples/poly_assoc/poly_assoc_generic.py | 10 ++++----- examples/polymorph/concrete.py | 12 +++++----- examples/polymorph/polymorph.py | 22 +++++++++---------- examples/polymorph/single.py | 20 ++++++++--------- examples/postgis/postgis.py | 14 ++++++------ examples/sharding/attribute_shard.py | 15 +++++++------ examples/vertical/dictlike-polymorphic.py | 16 ++++++++------ examples/vertical/dictlike.py | 13 ++++++----- examples/vertical/vertical.py | 5 +++-- lib/sqlalchemy/sql/expression.py | 12 ++++++---- 25 files changed, 155 insertions(+), 137 deletions(-) diff --git a/examples/association/basic_association.py b/examples/association/basic_association.py index 8078a2bb9c..a56d2383e6 100644 --- a/examples/association/basic_association.py +++ b/examples/association/basic_association.py @@ -10,13 +10,14 @@ the price paid by the user for that particular order, which is independent of the price on each Item (since those can change). """ -import logging from datetime import datetime -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import (create_engine, MetaData, Table, Column, Integer, + String, DateTime, Numeric, ForeignKey, and_) +from sqlalchemy.orm import mapper, relation, create_session # Uncomment these to watch database activity. +#import logging #logging.basicConfig(format='%(message)s') #logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO) @@ -72,10 +73,10 @@ mapper(OrderItem, orderitems, properties={ session = create_session() # create our catalog -session.save(Item('SA T-Shirt', 10.99)) -session.save(Item('SA Mug', 6.50)) -session.save(Item('SA Hat', 8.99)) -session.save(Item('MySQL Crowbar', 16.99)) +session.add(Item('SA T-Shirt', 10.99)) +session.add(Item('SA Mug', 6.50)) +session.add(Item('SA Hat', 8.99)) +session.add(Item('MySQL Crowbar', 16.99)) session.flush() # function to return items from the DB @@ -89,10 +90,10 @@ order = Order('john smith') order.order_items.append(OrderItem(item('SA Mug'))) order.order_items.append(OrderItem(item('MySQL Crowbar'), 10.99)) order.order_items.append(OrderItem(item('SA Hat'))) -session.save(order) +session.add(order) session.flush() -session.clear() +session.expunge_all() # query the order, print items order = session.query(Order).filter_by(customer_name='john smith').one() diff --git a/examples/association/proxied_association.py b/examples/association/proxied_association.py index ed3afd597c..3a78e3adfb 100644 --- a/examples/association/proxied_association.py +++ b/examples/association/proxied_association.py @@ -2,8 +2,9 @@ the usage of the associationproxy extension.""" from datetime import datetime -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import (create_engine, MetaData, Table, Column, Integer, + String, DateTime, Float, ForeignKey, and_) +from sqlalchemy.orm import mapper, relation, create_session from sqlalchemy.ext.associationproxy import AssociationProxy engine = create_engine('sqlite://') @@ -82,7 +83,7 @@ order.items.append(item('SA Hat')) session.add(order) session.flush() -session.clear() +session.expunge_all() # query the order, print items order = session.query(Order).filter_by(customer_name='john smith').one() diff --git a/examples/collections/large_collection.py b/examples/collections/large_collection.py index 203aa6d230..2451ea5826 100644 --- a/examples/collections/large_collection.py +++ b/examples/collections/large_collection.py @@ -4,8 +4,10 @@ Also see the docs regarding the new "dynamic" relation option, which presents a more refined version of some of these patterns. """ -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import MetaData, Table, Column, Integer, String, ForeignKey +from sqlalchemy.orm import (mapper, relation, create_session, MapperExtension, + object_session) + meta = MetaData('sqlite://') meta.bind.echo = True @@ -56,11 +58,11 @@ org.members.append(Member('member one')) org.members.append(Member('member two')) org.members.append(Member('member three')) -sess.save(org) +sess.add(org) print "-------------------------\nflush one - save org + 3 members" sess.flush() -sess.clear() +sess.expunge_all() # reload. load the org and some child members print "-------------------------\nload subset of members" @@ -68,7 +70,7 @@ org = sess.query(Organization).get(org.org_id) members = org.member_query.filter(member_table.c.name.like('%member t%')).all() print members -sess.clear() +sess.expunge_all() # reload. create some more members and flush, without loading any of the original members @@ -80,7 +82,7 @@ org.members.append(Member('member six')) print "-------------------------\nflush two - save 3 more members" sess.flush() -sess.clear() +sess.expunge_all() org = sess.query(Organization).get(org.org_id) # now delete. note that this will explictily delete members four, five and six because they are in the session, diff --git a/examples/custom_attributes/custom_management.py b/examples/custom_attributes/custom_management.py index 707e182ba0..b8ea70dfd5 100644 --- a/examples/custom_attributes/custom_management.py +++ b/examples/custom_attributes/custom_management.py @@ -9,8 +9,10 @@ of "instance.__dict__". Note that the default collection implementations can be with a custom attribute system as well. """ -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import (create_engine, MetaData, Table, Column, Integer, Text, + ForeignKey) +from sqlalchemy.orm import (mapper, relation, create_session, + InstrumentationManager) from sqlalchemy.orm.attributes import set_attribute, get_attribute, del_attribute, is_instrumented from sqlalchemy.orm.collections import collection_adapter @@ -170,10 +172,10 @@ if __name__ == '__main__': assert isinstance(a1.bs, MyCollection) sess = create_session() - sess.save(a1) + sess.add(a1) sess.flush() - sess.clear() + sess.expunge_all() a1 = sess.query(A).get(a1.id) @@ -184,7 +186,7 @@ if __name__ == '__main__': a1.bs.remove(a1.bs[0]) sess.flush() - sess.clear() + sess.expunge_all() a1 = sess.query(A).get(a1.id) assert len(a1.bs) == 1 diff --git a/examples/custom_attributes/listen_for_events.py b/examples/custom_attributes/listen_for_events.py index de28df5b3a..3264b02462 100644 --- a/examples/custom_attributes/listen_for_events.py +++ b/examples/custom_attributes/listen_for_events.py @@ -39,8 +39,8 @@ class AttributeListener(AttributeExtension): if __name__ == '__main__': - from sqlalchemy import * - from sqlalchemy.orm import * + from sqlalchemy import Column, Integer, String, ForeignKey + from sqlalchemy.orm import relation from sqlalchemy.ext.declarative import declarative_base class Base(object): @@ -82,4 +82,4 @@ if __name__ == '__main__': m1.related.mapped.append(MyMappedClass(data='m2')) del m1.data - \ No newline at end of file + diff --git a/examples/derived_attributes/attributes.py b/examples/derived_attributes/attributes.py index f53badc745..4a16189854 100644 --- a/examples/derived_attributes/attributes.py +++ b/examples/derived_attributes/attributes.py @@ -36,8 +36,8 @@ def hybrid_property(fget, fset=None, fdel=None): ### Example code -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import MetaData, Table, Column, Integer +from sqlalchemy.orm import mapper, create_session metadata = MetaData('sqlite://') metadata.bind.echo = True @@ -99,14 +99,14 @@ session = create_session() intervals = [Interval1(1,4), Interval1(3,15), Interval1(11,16)] for interval in intervals: - session.save(interval) - session.save(Interval2(interval.start, interval.length)) + session.add(interval) + session.add(Interval2(interval.start, interval.length)) session.flush() print "Clear the cache and do some queries" -session.clear() +session.expunge_all() for Interval in (Interval1, Interval2): print "Querying using interval class %s" % Interval.__name__ diff --git a/examples/dynamic_dict/dynamic_dict.py b/examples/dynamic_dict/dynamic_dict.py index b47a6d68f6..3846c29944 100644 --- a/examples/dynamic_dict/dynamic_dict.py +++ b/examples/dynamic_dict/dynamic_dict.py @@ -40,8 +40,8 @@ class MyProxyDict(object): self.collection.append(value) from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import create_engine, Column, Integer, String, ForeignKey +from sqlalchemy.orm import sessionmaker, dynamic_loader Base = declarative_base(engine=create_engine('sqlite://')) diff --git a/examples/elementtree/adjacency_list.py b/examples/elementtree/adjacency_list.py index 706cc88a07..9efacad872 100644 --- a/examples/elementtree/adjacency_list.py +++ b/examples/elementtree/adjacency_list.py @@ -7,8 +7,9 @@ styles of persistence are identical, as is the structure of the main Document cl """ ################################# PART I - Imports/Coniguration ########################################### -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import (MetaData, Table, Column, Integer, String, ForeignKey, + Unicode, and_) +from sqlalchemy.orm import mapper, relation, create_session, lazyload import sys, os, StringIO, re @@ -22,8 +23,7 @@ logging.basicConfig() #logging.getLogger('sqlalchemy.engine').setLevel(logging.DEBUG) -from elementtree import ElementTree -from elementtree.ElementTree import Element, SubElement +from xml.etree import ElementTree meta = MetaData() meta.bind = 'sqlite://' @@ -157,14 +157,14 @@ session = create_session() for file in ('test.xml', 'test2.xml', 'test3.xml'): filename = os.path.join(os.path.dirname(sys.argv[0]), file) doc = ElementTree.parse(filename) - session.save(Document(file, doc)) + session.add(Document(file, doc)) print "\nSaving three documents...", line session.flush() print "Done." # clear session (to illustrate a full load), restore -session.clear() +session.expunge_all() print "\nFull text of document 'text.xml':", line document = session.query(Document).filter_by(filename="test.xml").first() diff --git a/examples/elementtree/optimized_al.py b/examples/elementtree/optimized_al.py index 8b50f6805d..39d35921a7 100644 --- a/examples/elementtree/optimized_al.py +++ b/examples/elementtree/optimized_al.py @@ -6,8 +6,9 @@ which joins on only three tables. """ ################################# PART I - Imports/Configuration ########################################### -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import (MetaData, Table, Column, Integer, String, ForeignKey, + Unicode, and_) +from sqlalchemy.orm import mapper, relation, create_session, lazyload import sys, os, StringIO, re @@ -21,8 +22,7 @@ logging.basicConfig() #logging.getLogger('sqlalchemy.engine').setLevel(logging.DEBUG) -from elementtree import ElementTree -from elementtree.ElementTree import Element, SubElement +from xml.etree import ElementTree meta = MetaData() meta.bind = 'sqlite://' @@ -166,14 +166,14 @@ session = create_session() for file in ('test.xml', 'test2.xml', 'test3.xml'): filename = os.path.join(os.path.dirname(sys.argv[0]), file) doc = ElementTree.parse(filename) - session.save(Document(file, doc)) + session.add(Document(file, doc)) print "\nSaving three documents...", line session.flush() print "Done." # clear session (to illustrate a full load), restore -session.clear() +session.expunge_all() print "\nFull text of document 'text.xml':", line document = session.query(Document).filter_by(filename="test.xml").first() diff --git a/examples/elementtree/pickle.py b/examples/elementtree/pickle.py index e7cd86984e..53d2ee2b6c 100644 --- a/examples/elementtree/pickle.py +++ b/examples/elementtree/pickle.py @@ -6,8 +6,9 @@ structure in distinct rows using two additional mapped entities. Note that the styles of persistence are identical, as is the structure of the main Document class. """ -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import (create_engine, MetaData, Table, Column, Integer, String, + PickleType) +from sqlalchemy.orm import mapper, create_session import sys, os @@ -20,7 +21,7 @@ logging.basicConfig() # uncomment to show SQL statements and result sets #logging.getLogger('sqlalchemy.engine').setLevel(logging.DEBUG) -from elementtree import ElementTree +from xml.etree import ElementTree engine = create_engine('sqlite://') meta = MetaData(engine) @@ -53,11 +54,11 @@ doc = ElementTree.parse(filename) # save to DB session = create_session() -session.save(Document("test.xml", doc)) +session.add(Document("test.xml", doc)) session.flush() # clear session (to illustrate a full load), restore -session.clear() +session.expunge_all() document = session.query(Document).filter_by(filename="test.xml").first() # print diff --git a/examples/graphs/graph1.py b/examples/graphs/graph1.py index 8188d7c870..6122e65f1f 100644 --- a/examples/graphs/graph1.py +++ b/examples/graphs/graph1.py @@ -1,7 +1,7 @@ """a directed graph example.""" -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import MetaData, Table, Column, Integer, ForeignKey +from sqlalchemy.orm import mapper, relation, create_session import logging logging.basicConfig() @@ -70,10 +70,10 @@ n7.add_neighbor(n2) n1.add_neighbor(n3) n2.add_neighbor(n1) -[session.save(x) for x in [n1, n2, n3, n4, n5, n6, n7]] +[session.add(x) for x in [n1, n2, n3, n4, n5, n6, n7]] session.flush() -session.clear() +session.expunge_all() n2 = session.query(Node).get(2) n3 = session.query(Node).get(3) diff --git a/examples/nested_sets/nested_sets.py b/examples/nested_sets/nested_sets.py index e83a263e93..fbb4817590 100644 --- a/examples/nested_sets/nested_sets.py +++ b/examples/nested_sets/nested_sets.py @@ -4,9 +4,9 @@ http://www.intelligententerprise.com/001020/celko.jhtml """ -from sqlalchemy import * -from sqlalchemy.orm import * -from sqlalchemy.orm import attributes +from sqlalchemy import (create_engine, Column, Integer, String, select, case, + func) +from sqlalchemy.orm import sessionmaker, MapperExtension, aliased from sqlalchemy.ext.declarative import declarative_base engine = create_engine('sqlite://', echo=True) diff --git a/examples/pickle/custom_pickler.py b/examples/pickle/custom_pickler.py index 1c88c88e82..79a8b3fa39 100644 --- a/examples/pickle/custom_pickler.py +++ b/examples/pickle/custom_pickler.py @@ -1,7 +1,8 @@ """illustrates one way to use a custom pickler that is session-aware.""" -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import MetaData, Table, Column, Integer, String, PickleType +from sqlalchemy.orm import (mapper, create_session, MapperExtension, + class_mapper, EXT_CONTINUE) from sqlalchemy.orm.session import object_session from cStringIO import StringIO from pickle import Pickler, Unpickler @@ -28,7 +29,7 @@ class MyPickler(object): if getattr(obj, "id", None) is None: sess = MyPickler.sessions.current newsess = create_session(bind=sess.connection(class_mapper(Bar))) - newsess.save(obj) + newsess.add(obj) newsess.flush() key = "%s:%s" % (type(obj).__name__, obj.id) return key @@ -74,9 +75,9 @@ mapper(Bar, bar_table) sess = create_session() f = Foo() f.bar = Bar('some bar') -sess.save(f) +sess.add(f) sess.flush() -sess.clear() +sess.expunge_all() del MyPickler.sessions.current diff --git a/examples/poly_assoc/poly_assoc.py b/examples/poly_assoc/poly_assoc.py index 3823f4b7f0..6e09935cb1 100644 --- a/examples/poly_assoc/poly_assoc.py +++ b/examples/poly_assoc/poly_assoc.py @@ -20,8 +20,9 @@ the associated target object from those which associate with it. """ -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import MetaData, Table, Column, Integer, String, and_ +from sqlalchemy.orm import (mapper, relation, create_session, class_mapper, + backref) metadata = MetaData('sqlite://') @@ -124,11 +125,11 @@ a3 = o1.create_address() a3.street = '444 park ave.' sess = create_session() -sess.save(u1) -sess.save(o1) +sess.add(u1) +sess.add(o1) sess.flush() -sess.clear() +sess.expunge_all() # query objects, get their addresses diff --git a/examples/poly_assoc/poly_assoc_fk.py b/examples/poly_assoc/poly_assoc_fk.py index 32600fcbf2..f5dda2e395 100644 --- a/examples/poly_assoc/poly_assoc_fk.py +++ b/examples/poly_assoc/poly_assoc_fk.py @@ -19,8 +19,8 @@ For a more genericized version of this example, see poly_assoc_generic.py. """ -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import MetaData, Table, Column, Integer, String, ForeignKey +from sqlalchemy.orm import mapper, relation, create_session, class_mapper metadata = MetaData('sqlite://') @@ -137,11 +137,11 @@ o1.address = Address() o1.address.street = '444 park ave.' sess = create_session() -sess.save(u1) -sess.save(o1) +sess.add(u1) +sess.add(o1) sess.flush() -sess.clear() +sess.expunge_all() # query objects, get their addresses diff --git a/examples/poly_assoc/poly_assoc_generic.py b/examples/poly_assoc/poly_assoc_generic.py index 8cc3edf609..233df51958 100644 --- a/examples/poly_assoc/poly_assoc_generic.py +++ b/examples/poly_assoc/poly_assoc_generic.py @@ -6,8 +6,8 @@ function "association" which creates a new polymorphic association "interface". """ -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import MetaData, Table, Column, Integer, String, ForeignKey +from sqlalchemy.orm import mapper, relation, create_session, class_mapper metadata = MetaData('sqlite://') @@ -133,11 +133,11 @@ o1.address = Address() o1.address.street = '444 park ave.' sess = create_session() -sess.save(u1) -sess.save(o1) +sess.add(u1) +sess.add(o1) sess.flush() -sess.clear() +sess.expunge_all() # query objects, get their addresses diff --git a/examples/polymorph/concrete.py b/examples/polymorph/concrete.py index 5f12e9a3d7..c50513b555 100644 --- a/examples/polymorph/concrete.py +++ b/examples/polymorph/concrete.py @@ -1,5 +1,5 @@ -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String +from sqlalchemy.orm import mapper, create_session, polymorphic_union metadata = MetaData() @@ -56,11 +56,11 @@ m1 = Manager("pointy haired boss", "manager1") e1 = Engineer("wally", "engineer1") e2 = Engineer("dilbert", "engineer2") -session.save(m1) -session.save(e1) -session.save(e2) +session.add(m1) +session.add(e1) +session.add(e2) session.flush() -employees = session.query(Employee).select() +employees = session.query(Employee) print [e for e in employees] diff --git a/examples/polymorph/polymorph.py b/examples/polymorph/polymorph.py index 4f3aeb7d26..ea56ffed1f 100644 --- a/examples/polymorph/polymorph.py +++ b/examples/polymorph/polymorph.py @@ -1,5 +1,5 @@ -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import MetaData, Table, Column, Integer, String, ForeignKey +from sqlalchemy.orm import mapper, relation, create_session import sets # this example illustrates a polymorphic load of two classes @@ -58,12 +58,12 @@ class Company(object): person_join = people.outerjoin(engineers).outerjoin(managers) -person_mapper = mapper(Person, people, select_table=person_join,polymorphic_on=people.c.type, polymorphic_identity='person') +person_mapper = mapper(Person, people, polymorphic_on=people.c.type, polymorphic_identity='person') mapper(Engineer, engineers, inherits=person_mapper, polymorphic_identity='engineer') mapper(Manager, managers, inherits=person_mapper, polymorphic_identity='manager') mapper(Company, companies, properties={ - 'employees': relation(Person, lazy=False, private=True, backref='company') + 'employees': relation(Person, lazy=False, backref='company', cascade="all, delete-orphan") }) session = create_session(echo_uow=False) @@ -73,30 +73,30 @@ c.employees.append(Engineer(name='dilbert', status='BBA', engineer_name='enginee c.employees.append(Person(name='joesmith', status='HHH')) c.employees.append(Engineer(name='wally', status='CGG', engineer_name='engineer2', primary_language='python')) c.employees.append(Manager(name='jsmith', status='ABA', manager_name='manager2')) -session.save(c) +session.add(c) print session.new session.flush() -session.clear() +session.expunge_all() c = session.query(Company).get(1) for e in c.employees: - print e, e._instance_key, e.company + print e, e._sa_instance_state.key, e.company assert sets.Set([e.name for e in c.employees]) == sets.Set(['pointy haired boss', 'dilbert', 'joesmith', 'wally', 'jsmith']) print "\n" -dilbert = session.query(Person).get_by(name='dilbert') -dilbert2 = session.query(Engineer).get_by(name='dilbert') +dilbert = session.query(Person).filter_by(name='dilbert').one() +dilbert2 = session.query(Engineer).filter_by(name='dilbert').one() assert dilbert is dilbert2 dilbert.engineer_name = 'hes dibert!' session.flush() -session.clear() +session.expunge_all() c = session.query(Company).get(1) for e in c.employees: - print e, e._instance_key + print e, e._sa_instance_state.key session.delete(c) session.flush() diff --git a/examples/polymorph/single.py b/examples/polymorph/single.py index dfc4264169..5a4f5c8413 100644 --- a/examples/polymorph/single.py +++ b/examples/polymorph/single.py @@ -1,5 +1,5 @@ -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import MetaData, Table, Column, Integer, String, ForeignKey +from sqlalchemy.orm import mapper, relation, create_session metadata = MetaData('sqlite://') metadata.bind.echo = 'debug' @@ -48,7 +48,7 @@ engineer_mapper = mapper(Engineer, inherits=person_mapper, polymorphic_identity= mapper(Company, companies, properties={ - 'employees': relation(Person, lazy=True, private=True, backref='company') + 'employees': relation(Person, lazy=True, backref='company') }) session = create_session() @@ -58,29 +58,29 @@ c.employees.append(Engineer(name='dilbert', status='BBA', engineer_name='enginee c.employees.append(Person(name='joesmith', status='HHH')) c.employees.append(Engineer(name='wally', status='CGG', engineer_name='engineer2', primary_language='python')) c.employees.append(Manager(name='jsmith', status='ABA', manager_name='manager2')) -session.save(c) +session.add(c) session.flush() -session.clear() +session.expunge_all() c = session.query(Company).get(1) for e in c.employees: - print e, e._instance_key, e.company + print e, e._sa_instance_state.key, e.company print "\n" -dilbert = session.query(Person).get_by(name='dilbert') -dilbert2 = session.query(Engineer).get_by(name='dilbert') +dilbert = session.query(Person).filter_by(name='dilbert').one() +dilbert2 = session.query(Engineer).filter_by(name='dilbert').one() assert dilbert is dilbert2 dilbert.engineer_name = 'hes dibert!' session.flush() -session.clear() +session.expunge_all() c = session.query(Company).get(1) for e in c.employees: - print e, e._instance_key + print e, e._sa_instance_state.key session.delete(c) session.flush() diff --git a/examples/postgis/postgis.py b/examples/postgis/postgis.py index 802aa0ea90..c482d82560 100644 --- a/examples/postgis/postgis.py +++ b/examples/postgis/postgis.py @@ -28,11 +28,10 @@ Includes: * a standalone operator example. The implementation is limited to only public, well known -and simple to use extension points, with the exception -of one temporary monkeypatch in the DDL extension. -Future SQLAlchemy expansion points may allow more seamless -integration of some features. - +and simple to use extension points. Future SQLAlchemy +expansion points may allow more seamless integration of +some features. + """ from sqlalchemy.orm.interfaces import AttributeExtension @@ -227,8 +226,9 @@ def GISColumn(*args, **kw): # illustrate usage if __name__ == '__main__': - from sqlalchemy import * - from sqlalchemy.orm import * + from sqlalchemy import (create_engine, MetaData, Column, Integer, String, + func, literal, select) + from sqlalchemy.orm import sessionmaker, column_property from sqlalchemy.ext.declarative import declarative_base engine = create_engine('postgres://scott:tiger@localhost/gistest', echo=True) diff --git a/examples/sharding/attribute_shard.py b/examples/sharding/attribute_shard.py index 0a9e992a32..45a019f135 100644 --- a/examples/sharding/attribute_shard.py +++ b/examples/sharding/attribute_shard.py @@ -18,8 +18,9 @@ To set up a sharding system, you need: """ # step 1. imports -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import (create_engine, MetaData, Table, Column, Integer, + String, ForeignKey, Float, DateTime) +from sqlalchemy.orm import sessionmaker, mapper, relation from sqlalchemy.orm.shard import ShardedSession from sqlalchemy.sql import operators from sqlalchemy import sql @@ -27,10 +28,10 @@ import datetime # step 2. databases echo = True -db1 = create_engine('sqlite:///shard1.db', echo=echo) -db2 = create_engine('sqlite:///shard2.db', echo=echo) -db3 = create_engine('sqlite:///shard3.db', echo=echo) -db4 = create_engine('sqlite:///shard4.db', echo=echo) +db1 = create_engine('sqlite://', echo=echo) +db2 = create_engine('sqlite://', echo=echo) +db3 = create_engine('sqlite://', echo=echo) +db4 = create_engine('sqlite://', echo=echo) # step 3. create session function. this binds the shard ids @@ -195,6 +196,6 @@ assert t.reports[0].temperature == 80.0 north_american_cities = sess.query(WeatherLocation).filter(WeatherLocation.continent == 'North America') assert [c.city for c in north_american_cities] == ['New York', 'Toronto'] -asia_and_europe = sess.query(WeatherLocation).filter(WeatherLocation.continent.in_('Europe', 'Asia')) +asia_and_europe = sess.query(WeatherLocation).filter(WeatherLocation.continent.in_(['Europe', 'Asia'])) assert set([c.city for c in asia_and_europe]) == set(['Tokyo', 'London', 'Dublin']) diff --git a/examples/vertical/dictlike-polymorphic.py b/examples/vertical/dictlike-polymorphic.py index 4065337c2e..6180fa3034 100644 --- a/examples/vertical/dictlike-polymorphic.py +++ b/examples/vertical/dictlike-polymorphic.py @@ -29,8 +29,8 @@ Note: Something much like 'comparable_property' is slated for inclusion in a future version of SQLAlchemy. """ -from sqlalchemy.orm.interfaces import PropComparator, MapperProperty -from sqlalchemy.orm import session as sessionlib, comparable_property +from sqlalchemy.orm.interfaces import PropComparator +from sqlalchemy.orm import comparable_property # Using the VerticalPropertyDictMixin from the base example from dictlike import VerticalPropertyDictMixin @@ -131,7 +131,9 @@ class PolymorphicVerticalProperty(object): if __name__ == '__main__': - from sqlalchemy import * + from sqlalchemy import (MetaData, Table, Column, Integer, Unicode, + ForeignKey, UnicodeText, and_, not_, or_, String, Boolean, cast, text, + null, case) from sqlalchemy.orm import mapper, relation, create_session from sqlalchemy.orm.collections import attribute_mapped_collection @@ -198,9 +200,9 @@ if __name__ == '__main__': stoat[u'cuteness'] = 7 stoat[u'weasel-like'] = True - session.save(stoat) + session.add(stoat) session.flush() - session.clear() + session.expunge_all() critter = session.query(Animal).filter(Animal.name == u'stoat').one() print critter[u'color'] @@ -217,14 +219,14 @@ if __name__ == '__main__': marten[u'cuteness'] = 5 marten[u'weasel-like'] = True marten[u'poisonous'] = False - session.save(marten) + session.add(marten) shrew = Animal(u'shrew') shrew[u'cuteness'] = 5 shrew[u'weasel-like'] = False shrew[u'poisonous'] = True - session.save(shrew) + session.add(shrew) session.flush() q = (session.query(Animal). diff --git a/examples/vertical/dictlike.py b/examples/vertical/dictlike.py index 5f478d7d05..1e1635ed76 100644 --- a/examples/vertical/dictlike.py +++ b/examples/vertical/dictlike.py @@ -122,7 +122,8 @@ class VerticalPropertyDictMixin(object): if __name__ == '__main__': - from sqlalchemy import * + from sqlalchemy import (MetaData, Table, Column, Integer, Unicode, + ForeignKey, UnicodeText, and_, not_) from sqlalchemy.orm import mapper, relation, create_session from sqlalchemy.orm.collections import attribute_mapped_collection @@ -183,9 +184,9 @@ if __name__ == '__main__': # stoat.facts collection: print stoat.facts[u'color'] - session.save(stoat) + session.add(stoat) session.flush() - session.clear() + session.expunge_all() critter = session.query(Animal).filter(Animal.name == u'stoat').one() print critter[u'color'] @@ -201,17 +202,17 @@ if __name__ == '__main__': marten = Animal(u'marten') marten[u'color'] = u'brown' marten[u'cuteness'] = u'somewhat' - session.save(marten) + session.add(marten) shrew = Animal(u'shrew') shrew[u'cuteness'] = u'somewhat' shrew[u'poisonous-part'] = u'saliva' - session.save(shrew) + session.add(shrew) loris = Animal(u'slow loris') loris[u'cuteness'] = u'fairly' loris[u'poisonous-part'] = u'elbows' - session.save(loris) + session.add(loris) session.flush() q = (session.query(Animal). diff --git a/examples/vertical/vertical.py b/examples/vertical/vertical.py index 6c3a61919e..4a8bf77871 100644 --- a/examples/vertical/vertical.py +++ b/examples/vertical/vertical.py @@ -2,8 +2,9 @@ represented in distinct database rows. This allows objects to be created with dynamically changing fields that are all persisted in a normalized fashion.""" -from sqlalchemy import * -from sqlalchemy.orm import * +from sqlalchemy import (create_engine, MetaData, Table, Column, Integer, String, + ForeignKey, PickleType, DateTime, and_) +from sqlalchemy.orm import mapper, relation, sessionmaker, scoped_session from sqlalchemy.orm.collections import mapped_collection import datetime diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py index 56f358db82..859419022d 100644 --- a/lib/sqlalchemy/sql/expression.py +++ b/lib/sqlalchemy/sql/expression.py @@ -2204,13 +2204,17 @@ class _Case(ColumnElement): whenlist = [(_literal_as_binds(c).self_group(), _literal_as_binds(r)) for (c, r) in whens] else: whenlist = [(_no_literals(c).self_group(), _literal_as_binds(r)) for (c, r) in whens] - + if whenlist: type_ = list(whenlist[-1])[-1].type else: type_ = None - - self.value = value + + if value is None: + self.value = None + else: + self.value = _literal_as_binds(value) + self.type = type_ self.whens = whenlist if else_ is not None: @@ -2236,7 +2240,7 @@ class _Case(ColumnElement): @property def _from_objects(self): - return itertools.chain(*[x._from_objects for x in self.get_children()]) + return list(itertools.chain(*[x._from_objects for x in self.get_children()])) class Function(ColumnElement, FromClause): """Describe a SQL function.""" -- 2.47.2