]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
remove this
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 26 May 2013 22:08:03 +0000 (18:08 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 26 May 2013 22:08:03 +0000 (18:08 -0400)
clean_2to3.diff [deleted file]

diff --git a/clean_2to3.diff b/clean_2to3.diff
deleted file mode 100644 (file)
index 7020fb9..0000000
+++ /dev/null
@@ -1,13522 +0,0 @@
-diff -r 9d0639b9d3be examples/adjacency_list/adjacency_list.py
---- a/examples/adjacency_list/adjacency_list.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/adjacency_list/adjacency_list.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -47,7 +47,7 @@
-                     "\n" + \
-                     "".join([
-                         c.dump(_indent +1)
--                        for c in self.children.values()]
-+                        for c in list(self.children.values())]
-                     )
-
- if __name__ == '__main__':
-@@ -55,9 +55,9 @@
-
-     def msg(msg, *args):
-         msg = msg % args
--        print "\n\n\n" + "-" * len(msg.split("\n")[0])
--        print msg
--        print "-" * len(msg.split("\n")[0])
-+        print("\n\n\n" + "-" * len(msg.split("\n")[0]))
-+        print(msg)
-+        print("-" * len(msg.split("\n")[0]))
-
-     msg("Creating Tree Table:")
-
-diff -r 9d0639b9d3be examples/association/basic_association.py
---- a/examples/association/basic_association.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/association/basic_association.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -83,12 +83,12 @@
-
-     # query the order, print items
-     order = session.query(Order).filter_by(customer_name='john smith').one()
--    print [(order_item.item.description, order_item.price)
--           for order_item in order.order_items]
-+    print([(order_item.item.description, order_item.price)
-+           for order_item in order.order_items])
-
-     # print customers who bought 'MySQL Crowbar' on sale
-     q = session.query(Order).join('order_items', 'item')
-     q = q.filter(and_(Item.description == 'MySQL Crowbar',
-                       Item.price > OrderItem.price))
-
--    print [order.customer_name for order in q]
-+    print([order.customer_name for order in q])
-diff -r 9d0639b9d3be examples/association/dict_of_sets_with_default.py
---- a/examples/association/dict_of_sets_with_default.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/association/dict_of_sets_with_default.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -75,13 +75,13 @@
-     session.commit()
-
-     a1 = session.query(A).first()
--    print a1.collections["1"]
-+    print(a1.collections["1"])
-     a1.collections["1"].add(4)
-     session.commit()
-
-     a1.collections["2"].update([7, 8, 9])
-     session.commit()
-
--    print a1.collections["2"]
-+    print(a1.collections["2"])
-
-
-diff -r 9d0639b9d3be examples/association/proxied_association.py
---- a/examples/association/proxied_association.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/association/proxied_association.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -86,16 +86,16 @@
-     order = session.query(Order).filter_by(customer_name='john smith').one()
-
-     # print items based on the OrderItem collection directly
--    print [(assoc.item.description, assoc.price, assoc.item.price)
--           for assoc in order.order_items]
-+    print([(assoc.item.description, assoc.price, assoc.item.price)
-+           for assoc in order.order_items])
-
-     # print items based on the "proxied" items collection
--    print [(item.description, item.price)
--           for item in order.items]
-+    print([(item.description, item.price)
-+           for item in order.items])
-
-     # print customers who bought 'MySQL Crowbar' on sale
-     orders = session.query(Order).\
-                     join('order_items', 'item').\
-                     filter(Item.description == 'MySQL Crowbar').\
-                     filter(Item.price > OrderItem.price)
--    print [o.customer_name for o in orders]
-+    print([o.customer_name for o in orders])
-diff -r 9d0639b9d3be examples/custom_attributes/listen_for_events.py
---- a/examples/custom_attributes/listen_for_events.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/custom_attributes/listen_for_events.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -34,7 +34,7 @@
-             if oldvalue:
-                 s += "which replaced the value '%s', " % oldvalue
-             s += "on object %s" % self
--            print s
-+            print(s)
-
-     Base = declarative_base(cls=Base)
-
-diff -r 9d0639b9d3be examples/dogpile_caching/advanced.py
---- a/examples/dogpile_caching/advanced.py     Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/dogpile_caching/advanced.py     Sat Apr 27 19:42:17 2013 -0400
-@@ -6,9 +6,9 @@
-
- """
-
--from environment import Session
--from model import Person, Address, cache_address_bits
--from caching_query import FromCache, RelationshipCache
-+from .environment import Session
-+from .model import Person, Address, cache_address_bits
-+from .caching_query import FromCache, RelationshipCache
- from sqlalchemy.orm import joinedload
-
- def load_name_range(start, end, invalidate=False):
-@@ -49,31 +49,31 @@
-
-     return q.all()
-
--print "two through twelve, possibly from cache:\n"
--print ", ".join([p.name for p in load_name_range(2, 12)])
-+print("two through twelve, possibly from cache:\n")
-+print(", ".join([p.name for p in load_name_range(2, 12)]))
-
--print "\ntwenty five through forty, possibly from cache:\n"
--print ", ".join([p.name for p in load_name_range(25, 40)])
-+print("\ntwenty five through forty, possibly from cache:\n")
-+print(", ".join([p.name for p in load_name_range(25, 40)]))
-
- # loading them again, no SQL is emitted
--print "\ntwo through twelve, from the cache:\n"
--print ", ".join([p.name for p in load_name_range(2, 12)])
-+print("\ntwo through twelve, from the cache:\n")
-+print(", ".join([p.name for p in load_name_range(2, 12)]))
-
- # but with invalidate, they are
--print "\ntwenty five through forty, invalidate first:\n"
--print ", ".join([p.name for p in load_name_range(25, 40, True)])
-+print("\ntwenty five through forty, invalidate first:\n")
-+print(", ".join([p.name for p in load_name_range(25, 40, True)]))
-
- # illustrate the address loading from either cache/already
- # on the Person
--print "\n\nPeople plus addresses, two through twelve, addresses possibly from cache"
-+print("\n\nPeople plus addresses, two through twelve, addresses possibly from cache")
- for p in load_name_range(2, 12):
--    print p.format_full()
-+    print(p.format_full())
-
- # illustrate the address loading from either cache/already
- # on the Person
--print "\n\nPeople plus addresses, two through twelve, addresses from cache"
-+print("\n\nPeople plus addresses, two through twelve, addresses from cache")
- for p in load_name_range(2, 12):
--    print p.format_full()
-+    print(p.format_full())
-
--print "\n\nIf this was the first run of advanced.py, try "\
--        "a second run.  Only one SQL statement will be emitted."
-+print("\n\nIf this was the first run of advanced.py, try "\
-+        "a second run.  Only one SQL statement will be emitted.")
-diff -r 9d0639b9d3be examples/dogpile_caching/caching_query.py
---- a/examples/dogpile_caching/caching_query.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/dogpile_caching/caching_query.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -143,8 +143,8 @@
-     # here we return the key as a long string.  our "key mangler"
-     # set up with the region will boil it down to an md5.
-     return " ".join(
--                    [unicode(compiled)] +
--                    [unicode(params[k]) for k in sorted(params)])
-+                    [str(compiled)] +
-+                    [str(params[k]) for k in sorted(params)])
-
- class FromCache(MapperOption):
-     """Specifies that a Query should load results from a cache."""
-diff -r 9d0639b9d3be examples/dogpile_caching/environment.py
---- a/examples/dogpile_caching/environment.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/dogpile_caching/environment.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -4,7 +4,7 @@
- bootstrap fixture data if necessary.
-
- """
--import caching_query
-+from . import caching_query
- from sqlalchemy import create_engine
- from sqlalchemy.orm import scoped_session, sessionmaker
- from sqlalchemy.ext.declarative import declarative_base
-@@ -31,7 +31,7 @@
- root = "./dogpile_data/"
-
- if not os.path.exists(root):
--    raw_input("Will create datafiles in %r.\n"
-+    input("Will create datafiles in %r.\n"
-                 "To reset the cache + database, delete this directory.\n"
-                 "Press enter to continue.\n" % root
-                 )
-@@ -77,7 +77,7 @@
-
- def bootstrap():
-     global installed
--    import fixture_data
-+    from . import fixture_data
-     if not os.path.exists(dbfile):
-         fixture_data.install()
-         installed = True
-\ No newline at end of file
-diff -r 9d0639b9d3be examples/dogpile_caching/fixture_data.py
---- a/examples/dogpile_caching/fixture_data.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/dogpile_caching/fixture_data.py Sat Apr 27 19:42:17 2013 -0400
-@@ -5,8 +5,8 @@
- randomly selected postal code.
-
- """
--from environment import Session, Base
--from model import City, Country, PostalCode, Person, Address
-+from .environment import Session, Base
-+from .model import City, Country, PostalCode, Person, Address
- import random
-
- def install():
-@@ -35,7 +35,7 @@
-         Session.add_all(pc)
-         all_post_codes.extend(pc)
-
--    for i in xrange(1, 51):
-+    for i in range(1, 51):
-         person = Person(
-                     "person %.2d" % i,
-                     Address(
-diff -r 9d0639b9d3be examples/dogpile_caching/helloworld.py
---- a/examples/dogpile_caching/helloworld.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/dogpile_caching/helloworld.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -4,12 +4,12 @@
-
- """
-
--from environment import Session
--from model import Person
--from caching_query import FromCache
-+from .environment import Session
-+from .model import Person
-+from .caching_query import FromCache
-
- # load Person objects.  cache the result under the namespace "all_people".
--print "loading people...."
-+print("loading people....")
- people = Session.query(Person).options(FromCache("default")).all()
-
- # remove the Session.  next query starts from scratch.
-@@ -17,12 +17,12 @@
-
- # load again, using the same FromCache option. now they're cached
- # under "all_people", no SQL is emitted.
--print "loading people....again!"
-+print("loading people....again!")
- people = Session.query(Person).options(FromCache("default")).all()
-
- # want to load on some different kind of query ?  change the namespace
- # you send to FromCache
--print "loading people two through twelve"
-+print("loading people two through twelve")
- people_two_through_twelve = Session.query(Person).\
-                             options(FromCache("default")).\
-                             filter(Person.name.between("person 02", "person 12")).\
-@@ -32,7 +32,7 @@
- # the bind parameters of the query.    So this query, having
- # different literal parameters under "Person.name.between()" than the
- # previous one, issues new SQL...
--print "loading people five through fifteen"
-+print("loading people five through fifteen")
- people_five_through_fifteen = Session.query(Person).\
-                             options(FromCache("default")).\
-                             filter(Person.name.between("person 05", "person 15")).\
-@@ -40,7 +40,7 @@
-
-
- # ... but using the same params as are already cached, no SQL
--print "loading people two through twelve...again!"
-+print("loading people two through twelve...again!")
- people_two_through_twelve = Session.query(Person).\
-                             options(FromCache("default")).\
-                             filter(Person.name.between("person 02", "person 12")).\
-@@ -51,7 +51,7 @@
- # each Query, which includes at the very least the same FromCache,
- # same list of objects to be loaded, and the same parameters in the
- # same order, then call invalidate().
--print "invalidating everything"
-+print("invalidating everything")
- Session.query(Person).options(FromCache("default")).invalidate()
- Session.query(Person).\
-             options(FromCache("default")).\
-diff -r 9d0639b9d3be examples/dogpile_caching/local_session_caching.py
---- a/examples/dogpile_caching/local_session_caching.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/dogpile_caching/local_session_caching.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -53,8 +53,8 @@
-
-
- if __name__ == '__main__':
--    from environment import Session, regions
--    from caching_query import FromCache
-+    from .environment import Session, regions
-+    from .caching_query import FromCache
-     from dogpile.cache import make_region
-
-     # set up a region based on the ScopedSessionBackend,
-@@ -67,7 +67,7 @@
-         }
-     )
-
--    from model import Person
-+    from .model import Person
-
-     # query to load Person by name, with criterion
-     # of "person 10"
-diff -r 9d0639b9d3be examples/dogpile_caching/model.py
---- a/examples/dogpile_caching/model.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/dogpile_caching/model.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -10,8 +10,8 @@
- """
- from sqlalchemy import Column, Integer, String, ForeignKey
- from sqlalchemy.orm import relationship
--from caching_query import FromCache, RelationshipCache
--from environment import Base, bootstrap
-+from .caching_query import FromCache, RelationshipCache
-+from .environment import Base, bootstrap
-
- class Country(Base):
-     __tablename__ = 'country'
-diff -r 9d0639b9d3be examples/dogpile_caching/relation_caching.py
---- a/examples/dogpile_caching/relation_caching.py     Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/dogpile_caching/relation_caching.py     Sat Apr 27 19:42:17 2013 -0400
-@@ -5,16 +5,16 @@
- term cache.
-
- """
--from environment import Session, root
--from model import Person, cache_address_bits
-+from .environment import Session, root
-+from .model import Person, cache_address_bits
- from sqlalchemy.orm import joinedload
- import os
-
- for p in Session.query(Person).options(joinedload(Person.addresses), cache_address_bits):
--    print p.format_full()
-+    print(p.format_full())
-
-
--print "\n\nIf this was the first run of relationship_caching.py, SQL was likely emitted to "\
-+print("\n\nIf this was the first run of relationship_caching.py, SQL was likely emitted to "\
-         "load postal codes, cities, countries.\n"\
-         "If run a second time, assuming the cache is still valid, "\
-         "only a single SQL statement will run - all "\
-@@ -22,4 +22,4 @@
-         "To clear the cache, delete the file %r.  \n"\
-         "This will cause a re-load of cities, postal codes and countries on "\
-         "the next run.\n"\
--        % os.path.join(root, 'cache.dbm')
-+        % os.path.join(root, 'cache.dbm'))
-diff -r 9d0639b9d3be examples/dynamic_dict/dynamic_dict.py
---- a/examples/dynamic_dict/dynamic_dict.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/dynamic_dict/dynamic_dict.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -1,88 +1,88 @@
--class ProxyDict(object):
--    def __init__(self, parent, collection_name, childclass, keyname):
--        self.parent = parent
--        self.collection_name = collection_name
--        self.childclass = childclass
--        self.keyname = keyname
--
--    @property
--    def collection(self):
--        return getattr(self.parent, self.collection_name)
--
--    def keys(self):
--        descriptor = getattr(self.childclass, self.keyname)
--        return [x[0] for x in self.collection.values(descriptor)]
--
--    def __getitem__(self, key):
--        x = self.collection.filter_by(**{self.keyname:key}).first()
--        if x:
--            return x
--        else:
--            raise KeyError(key)
--
--    def __setitem__(self, key, value):
--        try:
--            existing = self[key]
--            self.collection.remove(existing)
--        except KeyError:
--            pass
--        self.collection.append(value)
--
--from sqlalchemy.ext.declarative import declarative_base
--from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
--from sqlalchemy.orm import sessionmaker, relationship
--
--engine = create_engine('sqlite://', echo=True)
--Base = declarative_base(engine)
--
--class Parent(Base):
--    __tablename__ = 'parent'
--    id = Column(Integer, primary_key=True)
--    name = Column(String(50))
--    _collection = relationship("Child", lazy="dynamic",
--                                    cascade="all, delete-orphan")
--
--    @property
--    def child_map(self):
--        return ProxyDict(self, '_collection', Child, 'key')
--
--class Child(Base):
--    __tablename__ = 'child'
--    id = Column(Integer, primary_key=True)
--    key = Column(String(50))
--    parent_id = Column(Integer, ForeignKey('parent.id'))
--
--    def __repr__(self):
--        return "Child(key=%r)" % self.key
--
--Base.metadata.create_all()
--
--sess = sessionmaker()()
--
--p1 = Parent(name='p1')
--sess.add(p1)
--
--print "\n---------begin setting nodes, autoflush occurs\n"
--p1.child_map['k1'] = Child(key='k1')
--p1.child_map['k2'] = Child(key='k2')
--
--# this will autoflush the current map.
--# ['k1', 'k2']
--print "\n---------print keys - flushes first\n"
--print p1.child_map.keys()
--
--# k1
--print "\n---------print 'k1' node\n"
--print p1.child_map['k1']
--
--print "\n---------update 'k2' node - must find existing, and replace\n"
--p1.child_map['k2'] = Child(key='k2')
--
--print "\n---------print 'k2' key - flushes first\n"
--# k2
--print p1.child_map['k2']
--
--print "\n---------print all child nodes\n"
--# [k1, k2b]
--print sess.query(Child).all()
--
-+class ProxyDict(object):
-+    def __init__(self, parent, collection_name, childclass, keyname):
-+        self.parent = parent
-+        self.collection_name = collection_name
-+        self.childclass = childclass
-+        self.keyname = keyname
-+
-+    @property
-+    def collection(self):
-+        return getattr(self.parent, self.collection_name)
-+
-+    def keys(self):
-+        descriptor = getattr(self.childclass, self.keyname)
-+        return [x[0] for x in self.collection.values(descriptor)]
-+
-+    def __getitem__(self, key):
-+        x = self.collection.filter_by(**{self.keyname:key}).first()
-+        if x:
-+            return x
-+        else:
-+            raise KeyError(key)
-+
-+    def __setitem__(self, key, value):
-+        try:
-+            existing = self[key]
-+            self.collection.remove(existing)
-+        except KeyError:
-+            pass
-+        self.collection.append(value)
-+
-+from sqlalchemy.ext.declarative import declarative_base
-+from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
-+from sqlalchemy.orm import sessionmaker, relationship
-+
-+engine = create_engine('sqlite://', echo=True)
-+Base = declarative_base(engine)
-+
-+class Parent(Base):
-+    __tablename__ = 'parent'
-+    id = Column(Integer, primary_key=True)
-+    name = Column(String(50))
-+    _collection = relationship("Child", lazy="dynamic",
-+                                    cascade="all, delete-orphan")
-+
-+    @property
-+    def child_map(self):
-+        return ProxyDict(self, '_collection', Child, 'key')
-+
-+class Child(Base):
-+    __tablename__ = 'child'
-+    id = Column(Integer, primary_key=True)
-+    key = Column(String(50))
-+    parent_id = Column(Integer, ForeignKey('parent.id'))
-+
-+    def __repr__(self):
-+        return "Child(key=%r)" % self.key
-+
-+Base.metadata.create_all()
-+
-+sess = sessionmaker()()
-+
-+p1 = Parent(name='p1')
-+sess.add(p1)
-+
-+print("\n---------begin setting nodes, autoflush occurs\n")
-+p1.child_map['k1'] = Child(key='k1')
-+p1.child_map['k2'] = Child(key='k2')
-+
-+# this will autoflush the current map.
-+# ['k1', 'k2']
-+print("\n---------print keys - flushes first\n")
-+print(list(p1.child_map.keys()))
-+
-+# k1
-+print("\n---------print 'k1' node\n")
-+print(p1.child_map['k1'])
-+
-+print("\n---------update 'k2' node - must find existing, and replace\n")
-+p1.child_map['k2'] = Child(key='k2')
-+
-+print("\n---------print 'k2' key - flushes first\n")
-+# k2
-+print(p1.child_map['k2'])
-+
-+print("\n---------print all child nodes\n")
-+# [k1, k2b]
-+print(sess.query(Child).all())
-+
-diff -r 9d0639b9d3be examples/elementtree/adjacency_list.py
---- a/examples/elementtree/adjacency_list.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/elementtree/adjacency_list.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -11,7 +11,7 @@
-     Unicode, and_, create_engine)
- from sqlalchemy.orm import mapper, relationship, Session, lazyload
-
--import sys, os, StringIO, re
-+import sys, os, io, re
-
- from xml.etree import ElementTree
-
-@@ -56,7 +56,7 @@
-         self.element = element
-
-     def __str__(self):
--        buf = StringIO.StringIO()
-+        buf = io.StringIO()
-         self.element.write(buf)
-         return buf.getvalue()
-
-@@ -120,11 +120,11 @@
-     def __set__(self, document, element):
-         def traverse(node):
-             n = _Node()
--            n.tag = unicode(node.tag)
--            n.text = unicode(node.text)
--            n.tail = unicode(node.tail)
-+            n.tag = str(node.tag)
-+            n.text = str(node.text)
-+            n.tail = str(node.tail)
-             n.children = [traverse(n2) for n2 in node]
--            n.attributes = [_Attribute(unicode(k), unicode(v)) for k, v in node.attrib.iteritems()]
-+            n.attributes = [_Attribute(str(k), str(v)) for k, v in node.attrib.items()]
-             return n
-
-         document._root = traverse(element.getroot())
-@@ -150,23 +150,23 @@
-     doc = ElementTree.parse(filename)
-     session.add(Document(file, doc))
-
--print "\nSaving three documents...", line
-+print("\nSaving three documents...", line)
- session.commit()
--print "Done."
-+print("Done.")
-
--print "\nFull text of document 'text.xml':", line
-+print("\nFull text of document 'text.xml':", line)
- document = session.query(Document).filter_by(filename="test.xml").first()
-
--print document
-+print(document)
-
- ############################################ PART VI - Searching for Paths #########################
-
- # manually search for a document which contains "/somefile/header/field1:hi"
--d = session.query(Document).join('_root', aliased=True).filter(_Node.tag==u'somefile').\
--    join('children', aliased=True, from_joinpoint=True).filter(_Node.tag==u'header').\
-+d = session.query(Document).join('_root', aliased=True).filter(_Node.tag=='somefile').\
-+    join('children', aliased=True, from_joinpoint=True).filter(_Node.tag=='header').\
-     join('children', aliased=True, from_joinpoint=True).filter(
--            and_(_Node.tag==u'field1', _Node.text==u'hi')).one()
--print d
-+            and_(_Node.tag=='field1', _Node.text=='hi')).one()
-+print(d)
-
- # generalize the above approach into an extremely impoverished xpath function:
- def find_document(path, compareto):
-@@ -188,11 +188,11 @@
-     return query.options(lazyload('_root')).filter(_Node.text==compareto).all()
-
- for path, compareto in (
--        (u'/somefile/header/field1', u'hi'),
--        (u'/somefile/field1', u'hi'),
--        (u'/somefile/header/field2', u'there'),
--        (u'/somefile/header/field2[@attr=foo]', u'there')
-+        ('/somefile/header/field1', 'hi'),
-+        ('/somefile/field1', 'hi'),
-+        ('/somefile/header/field2', 'there'),
-+        ('/somefile/header/field2[@attr=foo]', 'there')
-     ):
--    print "\nDocuments containing '%s=%s':" % (path, compareto), line
--    print [d.filename for d in find_document(path, compareto)]
-+    print("\nDocuments containing '%s=%s':" % (path, compareto), line)
-+    print([d.filename for d in find_document(path, compareto)])
-
-diff -r 9d0639b9d3be examples/elementtree/optimized_al.py
---- a/examples/elementtree/optimized_al.py     Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/elementtree/optimized_al.py     Sat Apr 27 19:42:17 2013 -0400
-@@ -10,7 +10,7 @@
-     Unicode, and_, create_engine)
- from sqlalchemy.orm import mapper, relationship, Session, lazyload
-
--import sys, os, StringIO, re
-+import sys, os, io, re
-
- from xml.etree import ElementTree
-
-@@ -55,7 +55,7 @@
-         self.element = element
-
-     def __str__(self):
--        buf = StringIO.StringIO()
-+        buf = io.StringIO()
-         self.element.write(buf)
-         return buf.getvalue()
-
-@@ -127,12 +127,12 @@
-     def __set__(self, document, element):
-         def traverse(node):
-             n = _Node()
--            n.tag = unicode(node.tag)
--            n.text = unicode(node.text)
--            n.tail = unicode(node.tail)
-+            n.tag = str(node.tag)
-+            n.text = str(node.text)
-+            n.tail = str(node.tail)
-             document._nodes.append(n)
-             n.children = [traverse(n2) for n2 in node]
--            n.attributes = [_Attribute(unicode(k), unicode(v)) for k, v in node.attrib.iteritems()]
-+            n.attributes = [_Attribute(str(k), str(v)) for k, v in node.attrib.items()]
-             return n
-
-         traverse(element.getroot())
-@@ -158,27 +158,27 @@
-     doc = ElementTree.parse(filename)
-     session.add(Document(file, doc))
-
--print "\nSaving three documents...", line
-+print("\nSaving three documents...", line)
- session.commit()
--print "Done."
-+print("Done.")
-
--print "\nFull text of document 'text.xml':", line
-+print("\nFull text of document 'text.xml':", line)
- document = session.query(Document).filter_by(filename="test.xml").first()
-
--print document
-+print(document)
-
- ######################## PART VI - Searching for Paths #######################
-
- # manually search for a document which contains "/somefile/header/field1:hi"
--print "\nManual search for /somefile/header/field1=='hi':", line
-+print("\nManual search for /somefile/header/field1=='hi':", line)
- d = session.query(Document).join('_nodes', aliased=True).\
--                filter(and_(_Node.parent_id==None, _Node.tag==u'somefile')).\
-+                filter(and_(_Node.parent_id==None, _Node.tag=='somefile')).\
-                 join('children', aliased=True, from_joinpoint=True).\
--                filter(_Node.tag==u'header').\
-+                filter(_Node.tag=='header').\
-                 join('children', aliased=True, from_joinpoint=True).\
--                filter(and_(_Node.tag==u'field1', _Node.text==u'hi')).\
-+                filter(and_(_Node.tag=='field1', _Node.text=='hi')).\
-                 one()
--print d
-+print(d)
-
- # generalize the above approach into an extremely impoverished xpath function:
- def find_document(path, compareto):
-@@ -203,11 +203,11 @@
-     return query.options(lazyload('_nodes')).filter(_Node.text==compareto).all()
-
- for path, compareto in (
--        (u'/somefile/header/field1', u'hi'),
--        (u'/somefile/field1', u'hi'),
--        (u'/somefile/header/field2', u'there'),
--        (u'/somefile/header/field2[@attr=foo]', u'there')
-+        ('/somefile/header/field1', 'hi'),
-+        ('/somefile/field1', 'hi'),
-+        ('/somefile/header/field2', 'there'),
-+        ('/somefile/header/field2[@attr=foo]', 'there')
-     ):
--    print "\nDocuments containing '%s=%s':" % (path, compareto), line
--    print [d.filename for d in find_document(path, compareto)]
-+    print("\nDocuments containing '%s=%s':" % (path, compareto), line)
-+    print([d.filename for d in find_document(path, compareto)])
-
-diff -r 9d0639b9d3be examples/generic_associations/discriminator_on_association.py
---- a/examples/generic_associations/discriminator_on_association.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/generic_associations/discriminator_on_association.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -144,5 +144,5 @@
-
- for customer in session.query(Customer):
-     for address in customer.addresses:
--        print address
--        print address.parent
-\ No newline at end of file
-+        print(address)
-+        print(address.parent)
-\ No newline at end of file
-diff -r 9d0639b9d3be examples/generic_associations/table_per_association.py
---- a/examples/generic_associations/table_per_association.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/generic_associations/table_per_association.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -102,5 +102,5 @@
-
- for customer in session.query(Customer):
-     for address in customer.addresses:
--        print address
-+        print(address)
-         # no parent here
-\ No newline at end of file
-diff -r 9d0639b9d3be examples/generic_associations/table_per_related.py
---- a/examples/generic_associations/table_per_related.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/generic_associations/table_per_related.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -103,5 +103,5 @@
-
- for customer in session.query(Customer):
-     for address in customer.addresses:
--        print address
--        print address.parent
-\ No newline at end of file
-+        print(address)
-+        print(address.parent)
-\ No newline at end of file
-diff -r 9d0639b9d3be examples/inheritance/concrete.py
---- a/examples/inheritance/concrete.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/inheritance/concrete.py Sat Apr 27 19:42:17 2013 -0400
-@@ -68,5 +68,5 @@
- session.add(e2)
- session.commit()
-
--print session.query(Employee).all()
-+print(session.query(Employee).all())
-
-diff -r 9d0639b9d3be examples/inheritance/joined.py
---- a/examples/inheritance/joined.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/inheritance/joined.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -92,10 +92,10 @@
-
- c = session.query(Company).get(1)
- for e in c.employees:
--    print e, inspect(e).key, e.company
-+    print(e, inspect(e).key, e.company)
- assert set([e.name for e in c.employees]) == set(['pointy haired boss',
-         'dilbert', 'joesmith', 'wally', 'jsmith'])
--print "\n"
-+print("\n")
-
- dilbert = session.query(Person).filter_by(name='dilbert').one()
- dilbert2 = session.query(Engineer).filter_by(name='dilbert').one()
-@@ -107,29 +107,29 @@
-
- c = session.query(Company).get(1)
- for e in c.employees:
--    print e
-+    print(e)
-
- # query using with_polymorphic.
- eng_manager = with_polymorphic(Person, [Engineer, Manager], aliased=True)
--print session.query(eng_manager).\
-+print(session.query(eng_manager).\
-             filter(
-                 or_(eng_manager.Engineer.engineer_name=='engineer1',
-                     eng_manager.Manager.manager_name=='manager2'
-                 )
--            ).all()
-+            ).all())
-
- # illustrate join from Company,
- # We use aliased=True
- # to help when the selectable is used as the target of a join.
- eng_manager = with_polymorphic(Person, [Engineer, Manager], aliased=True)
--print session.query(Company).\
-+print(session.query(Company).\
-     join(
-         eng_manager,
-         Company.employees
-     ).filter(
-         or_(eng_manager.Engineer.engineer_name=='engineer1',
-             eng_manager.Manager.manager_name=='manager2')
--    ).all()
-+    ).all())
-
- session.commit()
-
-diff -r 9d0639b9d3be examples/inheritance/single.py
---- a/examples/inheritance/single.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/inheritance/single.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -23,7 +23,7 @@
-
- class Person(object):
-     def __init__(self, **kwargs):
--        for key, value in kwargs.iteritems():
-+        for key, value in kwargs.items():
-             setattr(self, key, value)
-     def __repr__(self):
-         return "Ordinary person %s" % self.name
-@@ -39,7 +39,7 @@
-                     (self.name, self.status, self.manager_name)
- class Company(object):
-     def __init__(self, **kwargs):
--        for key, value in kwargs.iteritems():
-+        for key, value in kwargs.items():
-             setattr(self, key, value)
-     def __repr__(self):
-         return "Company %s" % self.name
-@@ -79,9 +79,9 @@
-
- c = session.query(Company).get(1)
- for e in c.employees:
--    print e, e.company
-+    print(e, e.company)
-
--print "\n"
-+print("\n")
-
- dilbert = session.query(Person).filter_by(name='dilbert').one()
- dilbert2 = session.query(Engineer).filter_by(name='dilbert').one()
-@@ -94,7 +94,7 @@
-
- c = session.query(Company).get(1)
- for e in c.employees:
--    print e
-+    print(e)
-
- session.delete(c)
- session.commit()
-diff -r 9d0639b9d3be examples/large_collection/large_collection.py
---- a/examples/large_collection/large_collection.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/large_collection/large_collection.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -63,14 +63,14 @@
-
-     sess.add(org)
-
--    print "-------------------------\nflush one - save org + 3 members\n"
-+    print("-------------------------\nflush one - save org + 3 members\n")
-     sess.commit()
-
-     # the 'members' collection is a Query.  it issues
-     # SQL as needed to load subsets of the collection.
--    print "-------------------------\nload subset of members\n"
-+    print("-------------------------\nload subset of members\n")
-     members = org.members.filter(member_table.c.name.like('%member t%')).all()
--    print members
-+    print(members)
-
-     # new Members can be appended without any
-     # SQL being emitted to load the full collection
-@@ -78,19 +78,19 @@
-     org.members.append(Member('member five'))
-     org.members.append(Member('member six'))
-
--    print "-------------------------\nflush two - save 3 more members\n"
-+    print("-------------------------\nflush two - save 3 more members\n")
-     sess.commit()
-
-     # delete the object.   Using ON DELETE CASCADE
-     # SQL is only emitted for the head row - the Member rows
-     # disappear automatically without the need for additional SQL.
-     sess.delete(org)
--    print "-------------------------\nflush three - delete org, delete members in one statement\n"
-+    print("-------------------------\nflush three - delete org, delete members in one statement\n")
-     sess.commit()
-
--    print "-------------------------\nno Member rows should remain:\n"
--    print sess.query(Member).count()
-+    print("-------------------------\nno Member rows should remain:\n")
-+    print(sess.query(Member).count())
-     sess.close()
-
--    print "------------------------\ndone.  dropping tables."
-+    print("------------------------\ndone.  dropping tables.")
-     meta.drop_all(engine)
-\ No newline at end of file
-diff -r 9d0639b9d3be examples/nested_sets/nested_sets.py
---- a/examples/nested_sets/nested_sets.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/nested_sets/nested_sets.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -86,19 +86,19 @@
- session.add_all([albert, bert, chuck, donna, eddie, fred])
- session.commit()
-
--print(session.query(Employee).all())
-+print((session.query(Employee).all()))
-
- # 1. Find an employee and all his/her supervisors, no matter how deep the tree.
- ealias = aliased(Employee)
--print(session.query(Employee).\
-+print((session.query(Employee).\
-             filter(ealias.left.between(Employee.left, Employee.right)).\
--            filter(ealias.emp == 'Eddie').all())
-+            filter(ealias.emp == 'Eddie').all()))
-
- #2. Find the employee and all his/her subordinates.
- # (This query has a nice symmetry with the first query.)
--print(session.query(Employee).\
-+print((session.query(Employee).\
-     filter(Employee.left.between(ealias.left, ealias.right)).\
--    filter(ealias.emp == 'Chuck').all())
-+    filter(ealias.emp == 'Chuck').all()))
-
- #3. Find the level of each node, so you can print the tree
- # as an indented listing.
-@@ -107,5 +107,5 @@
-     filter(ealias.left.between(Employee.left, Employee.right)).\
-     group_by(ealias.emp).\
-         order_by(ealias.left):
--    print("    " * indentation + str(employee))
-+    print(("    " * indentation + str(employee)))
-
-diff -r 9d0639b9d3be examples/postgis/postgis.py
---- a/examples/postgis/postgis.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/postgis/postgis.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -251,7 +251,7 @@
-
-     road_table = Road.__table__
-     stmt = select([road_table]).where(road_table.c.road_geom.intersects(r1.road_geom))
--    print session.execute(stmt).fetchall()
-+    print(session.execute(stmt).fetchall())
-
-     # TODO: for some reason the auto-generated labels have the internal replacement
-     # strings exposed, even though PG doesn't complain
-diff -r 9d0639b9d3be examples/versioning/_lib.py
---- a/examples/versioning/_lib.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/versioning/_lib.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -17,7 +17,7 @@
- _repr_stack = set()
- class BasicEntity(object):
-     def __init__(self, **kw):
--        for key, value in kw.iteritems():
-+        for key, value in kw.items():
-             setattr(self, key, value)
-
-     def __repr__(self):
-@@ -74,7 +74,7 @@
-                 a = self
-                 b = other
-
--            for attr in a.__dict__.keys():
-+            for attr in list(a.__dict__.keys()):
-                 if attr.startswith('_'):
-                     continue
-                 value = getattr(a, attr)
-diff -r 9d0639b9d3be examples/versioning/history_meta.py
---- a/examples/versioning/history_meta.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/versioning/history_meta.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -49,7 +49,7 @@
-             cols.append(Column('version', Integer, primary_key=True))
-
-         if super_fks:
--            cols.append(ForeignKeyConstraint(*zip(*super_fks)))
-+            cols.append(ForeignKeyConstraint(*list(zip(*super_fks))))
-
-         table = Table(local_mapper.local_table.name + '_history', local_mapper.local_table.metadata,
-            *cols
-@@ -166,7 +166,7 @@
-
-     attr['version'] = obj.version
-     hist = history_cls()
--    for key, value in attr.iteritems():
-+    for key, value in attr.items():
-         setattr(hist, key, value)
-     session.add(hist)
-     obj.version += 1
-diff -r 9d0639b9d3be examples/versioning/test_versioning.py
---- a/examples/versioning/test_versioning.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/versioning/test_versioning.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -1,9 +1,9 @@
- from unittest import TestCase
- from sqlalchemy.ext.declarative import declarative_base
--from history_meta import Versioned, versioned_session
-+from .history_meta import Versioned, versioned_session
- from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
- from sqlalchemy.orm import clear_mappers, sessionmaker, deferred, relationship
--from _lib import ComparableEntity, eq_
-+from ._lib import ComparableEntity, eq_
-
- engine = Session = None
-
-@@ -188,9 +188,9 @@
-         eq_(
-             sess.query(BaseClassHistory).order_by(BaseClassHistory.id).all(),
-             [
--                SubClassSeparatePkHistory(id=1, name=u'sep1', type=u'sep', version=1),
--                BaseClassHistory(id=2, name=u'base1', type=u'base', version=1),
--                SubClassSamePkHistory(id=3, name=u'same1', type=u'same', version=1)
-+                SubClassSeparatePkHistory(id=1, name='sep1', type='sep', version=1),
-+                BaseClassHistory(id=2, name='base1', type='base', version=1),
-+                SubClassSamePkHistory(id=3, name='same1', type='same', version=1)
-             ]
-         )
-
-@@ -199,10 +199,10 @@
-         eq_(
-             sess.query(BaseClassHistory).order_by(BaseClassHistory.id, BaseClassHistory.version).all(),
-             [
--                SubClassSeparatePkHistory(id=1, name=u'sep1', type=u'sep', version=1),
--                BaseClassHistory(id=2, name=u'base1', type=u'base', version=1),
--                SubClassSamePkHistory(id=3, name=u'same1', type=u'same', version=1),
--                SubClassSamePkHistory(id=3, name=u'same1', type=u'same', version=2)
-+                SubClassSeparatePkHistory(id=1, name='sep1', type='sep', version=1),
-+                BaseClassHistory(id=2, name='base1', type='base', version=1),
-+                SubClassSamePkHistory(id=3, name='same1', type='same', version=1),
-+                SubClassSamePkHistory(id=3, name='same1', type='same', version=2)
-             ]
-         )
-
-@@ -210,11 +210,11 @@
-         eq_(
-             sess.query(BaseClassHistory).order_by(BaseClassHistory.id, BaseClassHistory.version).all(),
-             [
--                SubClassSeparatePkHistory(id=1, name=u'sep1', type=u'sep', version=1),
--                BaseClassHistory(id=2, name=u'base1', type=u'base', version=1),
--                BaseClassHistory(id=2, name=u'base1mod', type=u'base', version=2),
--                SubClassSamePkHistory(id=3, name=u'same1', type=u'same', version=1),
--                SubClassSamePkHistory(id=3, name=u'same1', type=u'same', version=2)
-+                SubClassSeparatePkHistory(id=1, name='sep1', type='sep', version=1),
-+                BaseClassHistory(id=2, name='base1', type='base', version=1),
-+                BaseClassHistory(id=2, name='base1mod', type='base', version=2),
-+                SubClassSamePkHistory(id=3, name='same1', type='same', version=1),
-+                SubClassSamePkHistory(id=3, name='same1', type='same', version=2)
-             ]
-         )
-
-@@ -249,7 +249,7 @@
-
-         eq_(
-             sess.query(BaseClassHistory).order_by(BaseClassHistory.id, BaseClassHistory.version).all(),
--            [BaseClassHistory(id=1, name=u'b1', type=u'base', version=1)]
-+            [BaseClassHistory(id=1, name='b1', type='base', version=1)]
-         )
-
-         sc.name ='s1modified'
-@@ -258,9 +258,9 @@
-         eq_(
-             sess.query(BaseClassHistory).order_by(BaseClassHistory.id, BaseClassHistory.version).all(),
-             [
--                BaseClassHistory(id=1, name=u'b1', type=u'base', version=1),
--                BaseClassHistory(id=1, name=u'b1modified', type=u'base', version=2),
--                SubClassHistory(id=2, name=u's1', type=u'sub', version=1)
-+                BaseClassHistory(id=1, name='b1', type='base', version=1),
-+                BaseClassHistory(id=1, name='b1modified', type='base', version=2),
-+                SubClassHistory(id=2, name='s1', type='sub', version=1)
-             ]
-         )
-
-diff -r 9d0639b9d3be examples/vertical/dictlike-polymorphic.py
---- a/examples/vertical/dictlike-polymorphic.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/vertical/dictlike-polymorphic.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -33,7 +33,7 @@
- from sqlalchemy.ext.hybrid import hybrid_property
-
- # Using the VerticalPropertyDictMixin from the base example
--from dictlike import VerticalPropertyDictMixin
-+from .dictlike import VerticalPropertyDictMixin
-
- class PolymorphicVerticalProperty(object):
-     """A key/value pair with polymorphic value storage.
-@@ -80,7 +80,7 @@
-
-     @hybrid_property
-     def value(self):
--        for discriminator, field in self.type_map.values():
-+        for discriminator, field in list(self.type_map.values()):
-             if self.type == discriminator:
-                 return getattr(self, field)
-         return None
-@@ -114,7 +114,7 @@
-
-         def _case(self):
-             whens = [(text("'%s'" % p[0]), cast(getattr(self.cls, p[1]), String))
--                     for p in self.cls.type_map.values()
-+                     for p in list(self.cls.type_map.values())
-                      if p[1] is not None]
-             return case(whens, self.cls.type, null())
-         def __eq__(self, other):
-@@ -150,9 +150,9 @@
-
-     class AnimalFact(PolymorphicVerticalProperty):
-         type_map = {
--            int: (u'integer', 'int_value'),
--            unicode: (u'char', 'char_value'),
--            bool: (u'boolean', 'boolean_value'),
-+            int: ('integer', 'int_value'),
-+            str: ('char', 'char_value'),
-+            bool: ('boolean', 'boolean_value'),
-             type(None): (None, None),
-             }
-
-@@ -190,42 +190,42 @@
-     metadata.create_all(engine)
-     session = Session(engine)
-
--    stoat = Animal(u'stoat')
--    stoat[u'color'] = u'red'
--    stoat[u'cuteness'] = 7
--    stoat[u'weasel-like'] = True
-+    stoat = Animal('stoat')
-+    stoat['color'] = 'red'
-+    stoat['cuteness'] = 7
-+    stoat['weasel-like'] = True
-
-     session.add(stoat)
-     session.commit()
-
--    critter = session.query(Animal).filter(Animal.name == u'stoat').one()
--    print critter[u'color']
--    print critter[u'cuteness']
-+    critter = session.query(Animal).filter(Animal.name == 'stoat').one()
-+    print(critter['color'])
-+    print(critter['cuteness'])
-
--    print "changing cuteness value and type:"
--    critter[u'cuteness'] = u'very cute'
-+    print("changing cuteness value and type:")
-+    critter['cuteness'] = 'very cute'
-
-     session.commit()
-
--    marten = Animal(u'marten')
--    marten[u'cuteness'] = 5
--    marten[u'weasel-like'] = True
--    marten[u'poisonous'] = False
-+    marten = Animal('marten')
-+    marten['cuteness'] = 5
-+    marten['weasel-like'] = True
-+    marten['poisonous'] = False
-     session.add(marten)
-
--    shrew = Animal(u'shrew')
--    shrew[u'cuteness'] = 5
--    shrew[u'weasel-like'] = False
--    shrew[u'poisonous'] = True
-+    shrew = Animal('shrew')
-+    shrew['cuteness'] = 5
-+    shrew['weasel-like'] = False
-+    shrew['poisonous'] = True
-
-     session.add(shrew)
-     session.commit()
-
-     q = (session.query(Animal).
-          filter(Animal.facts.any(
--           and_(AnimalFact.key == u'weasel-like',
-+           and_(AnimalFact.key == 'weasel-like',
-                 AnimalFact.value == True))))
--    print 'weasel-like animals', q.all()
-+    print('weasel-like animals', q.all())
-
-     # Save some typing by wrapping that up in a function:
-     with_characteristic = lambda key, value: and_(AnimalFact.key == key,
-@@ -233,24 +233,24 @@
-
-     q = (session.query(Animal).
-          filter(Animal.facts.any(
--           with_characteristic(u'weasel-like', True))))
--    print 'weasel-like animals again', q.all()
-+           with_characteristic('weasel-like', True))))
-+    print('weasel-like animals again', q.all())
-
-     q = (session.query(Animal).
--           filter(Animal.facts.any(with_characteristic(u'poisonous', False))))
--    print 'animals with poisonous=False', q.all()
-+           filter(Animal.facts.any(with_characteristic('poisonous', False))))
-+    print('animals with poisonous=False', q.all())
-
-     q = (session.query(Animal).
-          filter(or_(Animal.facts.any(
--                      with_characteristic(u'poisonous', False)),
--                    not_(Animal.facts.any(AnimalFact.key == u'poisonous')))))
--    print 'non-poisonous animals', q.all()
-+                      with_characteristic('poisonous', False)),
-+                    not_(Animal.facts.any(AnimalFact.key == 'poisonous')))))
-+    print('non-poisonous animals', q.all())
-
-     q = (session.query(Animal).
-          filter(Animal.facts.any(AnimalFact.value == 5)))
--    print 'any animal with a .value of 5', q.all()
-+    print('any animal with a .value of 5', q.all())
-
-     # Facts can be queried as well.
-     q = (session.query(AnimalFact).
--         filter(with_characteristic(u'cuteness', u'very cute')))
--    print q.all()
-+         filter(with_characteristic('cuteness', 'very cute')))
-+    print(q.all())
-diff -r 9d0639b9d3be examples/vertical/dictlike.py
---- a/examples/vertical/dictlike.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/examples/vertical/dictlike.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -110,16 +110,16 @@
-
-     # Implement other dict methods to taste.  Here are some examples:
-     def keys(self):
--        return self.__map.keys()
-+        return list(self.__map.keys())
-
-     def values(self):
--        return [prop.value for prop in self.__map.values()]
-+        return [prop.value for prop in list(self.__map.values())]
-
-     def items(self):
--        return [(key, prop.value) for key, prop in self.__map.items()]
-+        return [(key, prop.value) for key, prop in list(self.__map.items())]
-
-     def __iter__(self):
--        return iter(self.keys())
-+        return iter(list(self.keys()))
-
-
- if __name__ == '__main__':
-@@ -176,49 +176,49 @@
-     metadata.create_all(engine)
-     session = Session(bind=engine)
-
--    stoat = Animal(u'stoat')
--    stoat[u'color'] = u'reddish'
--    stoat[u'cuteness'] = u'somewhat'
-+    stoat = Animal('stoat')
-+    stoat['color'] = 'reddish'
-+    stoat['cuteness'] = 'somewhat'
-
-     # dict-like assignment transparently creates entries in the
-     # stoat.facts collection:
--    print stoat.facts[u'color']
-+    print(stoat.facts['color'])
-
-     session.add(stoat)
-     session.commit()
-
--    critter = session.query(Animal).filter(Animal.name == u'stoat').one()
--    print critter[u'color']
--    print critter[u'cuteness']
-+    critter = session.query(Animal).filter(Animal.name == 'stoat').one()
-+    print(critter['color'])
-+    print(critter['cuteness'])
-
--    critter[u'cuteness'] = u'very'
-+    critter['cuteness'] = 'very'
-
--    print 'changing cuteness:'
-+    print('changing cuteness:')
-     engine.echo = True
-     session.commit()
-     engine.echo = False
-
--    marten = Animal(u'marten')
--    marten[u'color'] = u'brown'
--    marten[u'cuteness'] = u'somewhat'
-+    marten = Animal('marten')
-+    marten['color'] = 'brown'
-+    marten['cuteness'] = 'somewhat'
-     session.add(marten)
-
--    shrew = Animal(u'shrew')
--    shrew[u'cuteness'] = u'somewhat'
--    shrew[u'poisonous-part'] = u'saliva'
-+    shrew = Animal('shrew')
-+    shrew['cuteness'] = 'somewhat'
-+    shrew['poisonous-part'] = 'saliva'
-     session.add(shrew)
-
--    loris = Animal(u'slow loris')
--    loris[u'cuteness'] = u'fairly'
--    loris[u'poisonous-part'] = u'elbows'
-+    loris = Animal('slow loris')
-+    loris['cuteness'] = 'fairly'
-+    loris['poisonous-part'] = 'elbows'
-     session.add(loris)
-     session.commit()
-
-     q = (session.query(Animal).
-          filter(Animal.facts.any(
--           and_(AnimalFact.key == u'color',
--                AnimalFact.value == u'reddish'))))
--    print 'reddish animals', q.all()
-+           and_(AnimalFact.key == 'color',
-+                AnimalFact.value == 'reddish'))))
-+    print('reddish animals', q.all())
-
-     # Save some typing by wrapping that up in a function:
-     with_characteristic = lambda key, value: and_(AnimalFact.key == key,
-@@ -226,21 +226,21 @@
-
-     q = (session.query(Animal).
-          filter(Animal.facts.any(
--           with_characteristic(u'color', u'brown'))))
--    print 'brown animals', q.all()
-+           with_characteristic('color', 'brown'))))
-+    print('brown animals', q.all())
-
-     q = (session.query(Animal).
-            filter(not_(Animal.facts.any(
--                         with_characteristic(u'poisonous-part', u'elbows')))))
--    print 'animals without poisonous-part == elbows', q.all()
-+                         with_characteristic('poisonous-part', 'elbows')))))
-+    print('animals without poisonous-part == elbows', q.all())
-
-     q = (session.query(Animal).
--         filter(Animal.facts.any(AnimalFact.value == u'somewhat')))
--    print 'any animal with any .value of "somewhat"', q.all()
-+         filter(Animal.facts.any(AnimalFact.value == 'somewhat')))
-+    print('any animal with any .value of "somewhat"', q.all())
-
-     # Facts can be queried as well.
-     q = (session.query(AnimalFact).
--         filter(with_characteristic(u'cuteness', u'very')))
--    print 'just the facts', q.all()
-+         filter(with_characteristic('cuteness', 'very')))
-+    print('just the facts', q.all())
-
-
-diff -r 9d0639b9d3be lib/sqlalchemy/__init__.py
---- a/lib/sqlalchemy/__init__.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/__init__.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -117,7 +117,7 @@
- from .engine import create_engine, engine_from_config
-
-
--__all__ = sorted(name for name, obj in locals().items()
-+__all__ = sorted(name for name, obj in locals().items())
-                  if not (name.startswith('_') or _inspect.ismodule(obj)))
-
- __version__ = '0.8.1'
-diff -r 9d0639b9d3be lib/sqlalchemy/connectors/mxodbc.py
---- a/lib/sqlalchemy/connectors/mxodbc.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/connectors/mxodbc.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -82,7 +82,7 @@
-                           category=errorclass,
-                           stacklevel=2)
-             else:
--                raise errorclass, errorvalue
-+                raise errorclass(errorvalue)
-         return error_handler
-
-     def create_connect_args(self, url):
-diff -r 9d0639b9d3be lib/sqlalchemy/connectors/pyodbc.py
---- a/lib/sqlalchemy/connectors/pyodbc.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/connectors/pyodbc.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -9,7 +9,7 @@
-
- import sys
- import re
--import urllib
-+import urllib.request, urllib.parse, urllib.error
-
-
- class PyODBCConnector(Connector):
-@@ -59,7 +59,7 @@
-                 connect_args[param] = asbool(keys.pop(param))
-
-         if 'odbc_connect' in keys:
--            connectors = [urllib.unquote_plus(keys.pop('odbc_connect'))]
-+            connectors = [urllib.parse.unquote_plus(keys.pop('odbc_connect'))]
-         else:
-             dsn_connection = 'dsn' in keys or \
-                             ('host' in keys and 'database' not in keys)
-@@ -91,7 +91,7 @@
-                 connectors.append("AutoTranslate=%s" %
-                                     keys.pop("odbc_autotranslate"))
-
--            connectors.extend(['%s=%s' % (k, v) for k, v in keys.iteritems()])
-+            connectors.extend(['%s=%s' % (k, v) for k, v in keys.items()])
-         return [[";".join(connectors)], connect_args]
-
-     def is_disconnect(self, e, connection, cursor):
-@@ -123,16 +123,16 @@
-
-         # the "Py2K only" part here is theoretical.
-         # have not tried pyodbc + python3.1 yet.
--        # Py2K
--        self.supports_unicode_statements = (
--            not self.freetds and not self.easysoft)
--        if self._user_supports_unicode_binds is not None:
--            self.supports_unicode_binds = self._user_supports_unicode_binds
--        else:
--            self.supports_unicode_binds = (
--                not self.freetds or self.freetds_driver_version >= '0.91'
--            ) and not self.easysoft
--        # end Py2K
-+# start Py2K
-+#        self.supports_unicode_statements = (
-+#            not self.freetds and not self.easysoft)
-+#        if self._user_supports_unicode_binds is not None:
-+#            self.supports_unicode_binds = self._user_supports_unicode_binds
-+#        else:
-+#            self.supports_unicode_binds = (
-+#                not self.freetds or self.freetds_driver_version >= '0.91'
-+#            ) and not self.easysoft
-+# end Py2K
-
-         # run other initialization which asks for user name, etc.
-         super(PyODBCConnector, self).initialize(connection)
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/firebird/base.py
---- a/lib/sqlalchemy/dialects/firebird/base.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/firebird/base.py Sat Apr 27 19:42:17 2013 -0400
-@@ -685,7 +685,7 @@
-                                 self.normalize_name(row['fname']))
-             fk['referred_columns'].append(
-                                 self.normalize_name(row['targetfname']))
--        return fks.values()
-+        return list(fks.values())
-
-     @reflection.cache
-     def get_indexes(self, connection, table_name, schema=None, **kw):
-@@ -716,7 +716,7 @@
-             indexrec['column_names'].append(
-                                 self.normalize_name(row['field_name']))
-
--        return indexes.values()
-+        return list(indexes.values())
-
-     def do_execute(self, cursor, statement, parameters, context=None):
-         # kinterbase does not accept a None, but wants an empty list
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/informix/base.py
---- a/lib/sqlalchemy/dialects/informix/base.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/informix/base.py Sat Apr 27 19:42:17 2013 -0400
-@@ -24,6 +24,7 @@
- from sqlalchemy.sql import compiler, text
- from sqlalchemy.engine import default, reflection
- from sqlalchemy import types as sqltypes
-+from functools import reduce
-
- RESERVED_WORDS = set(
-     ["abs", "absolute", "access", "access_method", "acos", "active", "add",
-@@ -298,7 +299,7 @@
-
-     def get_column_default_string(self, column):
-         if (isinstance(column.server_default, schema.DefaultClause) and
--            isinstance(column.server_default.arg, basestring)):
-+            isinstance(column.server_default.arg, str)):
-                 if isinstance(column.type, (sqltypes.Integer, sqltypes.Numeric)):
-                     return self.sql_compiler.process(text(column.server_default.arg))
-
-@@ -322,10 +323,10 @@
-         remote_table = list(constraint._elements.values())[0].column.table
-         text = "FOREIGN KEY (%s) REFERENCES %s (%s)" % (
-             ', '.join(preparer.quote(f.parent.name, f.parent.quote)
--                      for f in constraint._elements.values()),
-+                      for f in list(constraint._elements.values())),
-             preparer.format_table(remote_table),
-             ', '.join(preparer.quote(f.column.name, f.column.quote)
--                      for f in constraint._elements.values())
-+                      for f in list(constraint._elements.values()))
-         )
-         text += self.define_constraint_cascades(constraint)
-         text += self.define_constraint_deferrability(constraint)
-@@ -506,7 +507,7 @@
-             if remote_column not in remote_cols:
-                 remote_cols.append(remote_column)
-
--        return fkeys.values()
-+        return list(fkeys.values())
-
-     @reflection.cache
-     def get_pk_constraint(self, connection, table_name, schema=None, **kw):
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/mssql/adodbapi.py
---- a/lib/sqlalchemy/dialects/mssql/adodbapi.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/mssql/adodbapi.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -44,7 +44,7 @@
-
-     @classmethod
-     def import_dbapi(cls):
--        import adodbapi as module
-+        from . import adodbapi as module
-         return module
-
-     colspecs = util.update_copy(
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/mssql/base.py
---- a/lib/sqlalchemy/dialects/mssql/base.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/mssql/base.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -295,7 +295,7 @@
-         def process(value):
-             if isinstance(value, datetime.datetime):
-                 return value.date()
--            elif isinstance(value, basestring):
-+            elif isinstance(value, str):
-                 return datetime.date(*[
-                         int(x or 0)
-                         for x in self._reg.match(value).groups()
-@@ -328,7 +328,7 @@
-         def process(value):
-             if isinstance(value, datetime.datetime):
-                 return value.time()
--            elif isinstance(value, basestring):
-+            elif isinstance(value, str):
-                 return datetime.time(*[
-                         int(x or 0)
-                         for x in self._reg.match(value).groups()])
-@@ -1002,7 +1002,7 @@
-         # handle other included columns
-         if index.kwargs.get("mssql_include"):
-             inclusions = [index.table.c[col]
--                            if isinstance(col, basestring) else col
-+                            if isinstance(col, str) else col
-                           for col in index.kwargs["mssql_include"]]
-
-             text += " INCLUDE (%s)" \
-@@ -1103,7 +1103,7 @@
-                  query_timeout=None,
-                  use_scope_identity=True,
-                  max_identifier_length=None,
--                 schema_name=u"dbo", **opts):
-+                 schema_name="dbo", **opts):
-         self.query_timeout = int(query_timeout or 0)
-         self.schema_name = schema_name
-
-@@ -1123,7 +1123,7 @@
-
-     def initialize(self, connection):
-         super(MSDialect, self).initialize(connection)
--        if self.server_version_info[0] not in range(8, 17):
-+        if self.server_version_info[0] not in list(range(8, 17)):
-             # FreeTDS with version 4.2 seems to report here
-             # a number like "95.10.255".  Don't know what
-             # that is.  So emit warning.
-@@ -1150,7 +1150,7 @@
-             try:
-                 default_schema_name = connection.scalar(query, name=user_name)
-                 if default_schema_name is not None:
--                    return unicode(default_schema_name)
-+                    return str(default_schema_name)
-             except:
-                 pass
-         return self.schema_name
-@@ -1188,7 +1188,7 @@
-         s = sql.select([tables.c.table_name],
-             sql.and_(
-                 tables.c.table_schema == owner,
--                tables.c.table_type == u'BASE TABLE'
-+                tables.c.table_type == 'BASE TABLE'
-             ),
-             order_by=[tables.c.table_name]
-         )
-@@ -1202,7 +1202,7 @@
-         s = sql.select([tables.c.table_name],
-             sql.and_(
-                 tables.c.table_schema == owner,
--                tables.c.table_type == u'VIEW'
-+                tables.c.table_type == 'VIEW'
-             ),
-             order_by=[tables.c.table_name]
-         )
-@@ -1267,7 +1267,7 @@
-             if row['index_id'] in indexes:
-                 indexes[row['index_id']]['column_names'].append(row['name'])
-
--        return indexes.values()
-+        return list(indexes.values())
-
-     @reflection.cache
-     @_db_plus_owner
-@@ -1474,4 +1474,4 @@
-             local_cols.append(scol)
-             remote_cols.append(rcol)
-
--        return fkeys.values()
-+        return list(fkeys.values())
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/mssql/information_schema.py
---- a/lib/sqlalchemy/dialects/mssql/information_schema.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/mssql/information_schema.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -17,10 +17,10 @@
-     impl = Unicode
-
-     def process_bind_param(self, value, dialect):
--        # Py2K
--        if isinstance(value, str):
--            value = value.decode(dialect.encoding)
--        # end Py2K
-+# start Py2K
-+#        if isinstance(value, str):
-+#            value = value.decode(dialect.encoding)
-+# end Py2K
-         return value
-
-     def bind_expression(self, bindvalue):
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/mssql/pyodbc.py
---- a/lib/sqlalchemy/dialects/mssql/pyodbc.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/mssql/pyodbc.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -219,7 +219,7 @@
-                     # without closing it (FreeTDS particularly)
-                     row = self.cursor.fetchall()[0]
-                     break
--                except self.dialect.dbapi.Error, e:
-+                except self.dialect.dbapi.Error as e:
-                     # no way around this - nextset() consumes the previous set
-                     # so we need to just keep flipping
-                     self.cursor.nextset()
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/mysql/base.py
---- a/lib/sqlalchemy/dialects/mysql/base.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/mysql/base.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -652,7 +652,7 @@
-
-         def process(value):
-             if value is not None:
--                v = 0L
-+                v = 0
-                 for i in map(ord, value):
-                     v = v << 8 | i
-                 return v
-@@ -1171,7 +1171,7 @@
-         super_convert = super(SET, self).bind_processor(dialect)
-
-         def process(value):
--            if value is None or isinstance(value, (int, long, basestring)):
-+            if value is None or isinstance(value, (int, str)):
-                 pass
-             else:
-                 if None in value:
-@@ -1352,7 +1352,7 @@
-           of a SELECT.
-
-         """
--        if isinstance(select._distinct, basestring):
-+        if isinstance(select._distinct, str):
-             return select._distinct.upper() + " "
-         elif select._distinct:
-             return "DISTINCT "
-@@ -1441,7 +1441,7 @@
-                         MySQLDDLCompiler, self).create_table_constraints(table)
-
-         engine_key = '%s_engine' % self.dialect.name
--        is_innodb = table.kwargs.has_key(engine_key) and \
-+        is_innodb = engine_key in table.kwargs and \
-                     table.kwargs[engine_key].lower() == 'innodb'
-
-         auto_inc_column = table._autoincrement_column
-@@ -1494,7 +1494,7 @@
-                 k[len(self.dialect.name) + 1:].upper(),
-                 v
-             )
--            for k, v in table.kwargs.items()
-+            for k, v in list(table.kwargs.items())
-             if k.startswith('%s_' % self.dialect.name)
-         )
-
-@@ -2045,7 +2045,7 @@
-                 have = rs.fetchone() is not None
-                 rs.close()
-                 return have
--            except exc.DBAPIError, e:
-+            except exc.DBAPIError as e:
-                 if self._extract_error_code(e.orig) == 1146:
-                     return False
-                 raise
-@@ -2328,7 +2328,7 @@
-         rp = None
-         try:
-             rp = connection.execute(st)
--        except exc.DBAPIError, e:
-+        except exc.DBAPIError as e:
-             if self._extract_error_code(e.orig) == 1146:
-                 raise exc.NoSuchTableError(full_name)
-             else:
-@@ -2352,7 +2352,7 @@
-         try:
-             try:
-                 rp = connection.execute(st)
--            except exc.DBAPIError, e:
-+            except exc.DBAPIError as e:
-                 if self._extract_error_code(e.orig) == 1146:
-                     raise exc.NoSuchTableError(full_name)
-                 else:
-@@ -2485,7 +2485,7 @@
-         for nope in ('auto_increment', 'data directory', 'index directory'):
-             options.pop(nope, None)
-
--        for opt, val in options.items():
-+        for opt, val in list(options.items()):
-             state.table_options['%s_%s' % (self.dialect.name, opt)] = val
-
-     def _parse_column(self, line, state):
-@@ -2626,11 +2626,11 @@
-
-         _final = self.preparer.final_quote
-
--        quotes = dict(zip(('iq', 'fq', 'esc_fq'),
-+        quotes = dict(list(zip(('iq', 'fq', 'esc_fq'),
-                           [re.escape(s) for s in
-                            (self.preparer.initial_quote,
-                             _final,
--                            self.preparer._escape_identifier(_final))]))
-+                            self.preparer._escape_identifier(_final))])))
-
-         self._pr_name = _pr_compile(
-             r'^CREATE (?:\w+ +)?TABLE +'
-@@ -2802,11 +2802,12 @@
-         item = self.rowproxy[index]
-         if isinstance(item, _array):
-             item = item.tostring()
--        # Py2K
--        if self.charset and isinstance(item, str):
--        # end Py2K
--        # Py3K
--        #if self.charset and isinstance(item, bytes):
-+# start Py2K
-+#        if self.charset and isinstance(item, str):
-+# end Py2K
-+# start Py3K
-+        if self.charset and isinstance(item, bytes):
-+# end Py3K
-             return item.decode(self.charset)
-         else:
-             return item
-@@ -2815,11 +2816,12 @@
-         item = getattr(self.rowproxy, attr)
-         if isinstance(item, _array):
-             item = item.tostring()
--        # Py2K
--        if self.charset and isinstance(item, str):
--        # end Py2K
--        # Py3K
--        #if self.charset and isinstance(item, bytes):
-+# start Py2K
-+#        if self.charset and isinstance(item, str):
-+# end Py2K
-+# start Py3K
-+        if self.charset and isinstance(item, bytes):
-+# end Py3K
-             return item.decode(self.charset)
-         else:
-             return item
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/mysql/cymysql.py
---- a/lib/sqlalchemy/dialects/mysql/cymysql.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/mysql/cymysql.py Sat Apr 27 19:42:17 2013 -0400
-@@ -25,15 +25,16 @@
-
-         def process(value):
-             if value is not None:
--                # Py2K
--                v = 0L
--                for i in map(ord, value):
-+# start Py2K
-+#                v = 0L
-+#                for i in map(ord, value):
-+#                    v = v << 8 | i
-+# end Py2K
-+# start Py3K
-+                v = 0
-+                for i in value:
-                     v = v << 8 | i
--                # end Py2K
--                # Py3K
--                #v = 0
--                #for i in value:
--                #    v = v << 8 | i
-+# end Py3K
-                 return v
-             return value
-         return process
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/mysql/oursql.py
---- a/lib/sqlalchemy/dialects/mysql/oursql.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/mysql/oursql.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -55,9 +55,9 @@
-
- class MySQLDialect_oursql(MySQLDialect):
-     driver = 'oursql'
--# Py2K
--    supports_unicode_binds = True
--    supports_unicode_statements = True
-+# start Py2K
-+#    supports_unicode_binds = True
-+#    supports_unicode_statements = True
- # end Py2K
-
-     supports_native_decimal = True
-@@ -90,12 +90,13 @@
-         connection.cursor().execute('BEGIN', plain_query=True)
-
-     def _xa_query(self, connection, query, xid):
--# Py2K
--        arg = connection.connection._escape_string(xid)
-+# start Py2K
-+#        arg = connection.connection._escape_string(xid)
- # end Py2K
--# Py3K
--#        charset = self._connection_charset
--#        arg = connection.connection._escape_string(xid.encode(charset)).decode(charset)
-+# start Py3K
-+        charset = self._connection_charset
-+        arg = connection.connection._escape_string(xid.encode(charset)).decode(charset)
-+# end Py3K
-         arg = "'%s'" % arg
-         connection.execution_options(_oursql_plain_query=True).execute(query % arg)
-
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/mysql/zxjdbc.py
---- a/lib/sqlalchemy/dialects/mysql/zxjdbc.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/mysql/zxjdbc.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -37,7 +37,7 @@
-                 return value
-             if isinstance(value, bool):
-                 return int(value)
--            v = 0L
-+            v = 0
-             for i in value:
-                 v = v << 8 | (i & 0xff)
-             value = v
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/oracle/base.py
---- a/lib/sqlalchemy/dialects/oracle/base.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/oracle/base.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -437,7 +437,7 @@
-
-     def get_select_hint_text(self, byfroms):
-         return " ".join(
--            "/*+ %s */" % text for table, text in byfroms.items()
-+            "/*+ %s */" % text for table, text in list(byfroms.items())
-         )
-
-     def function_argspec(self, fn, **kw):
-@@ -654,14 +654,14 @@
- class OracleIdentifierPreparer(compiler.IdentifierPreparer):
-
-     reserved_words = set([x.lower() for x in RESERVED_WORDS])
--    illegal_initial_characters = set(xrange(0, 10)).union(["_", "$"])
-+    illegal_initial_characters = set(range(0, 10)).union(["_", "$"])
-
-     def _bindparam_requires_quotes(self, value):
-         """Return True if the given identifier requires quoting."""
-         lc_value = value.lower()
-         return (lc_value in self.reserved_words
-                 or value[0] in self.illegal_initial_characters
--                or not self.legal_characters.match(unicode(value))
-+                or not self.legal_characters.match(str(value))
-                 )
-
-     def format_savepoint(self, savepoint):
-@@ -765,10 +765,10 @@
-     def normalize_name(self, name):
-         if name is None:
-             return None
--        # Py2K
--        if isinstance(name, str):
--            name = name.decode(self.encoding)
--        # end Py2K
-+# start Py2K
-+#        if isinstance(name, str):
-+#            name = name.decode(self.encoding)
-+# end Py2K
-         if name.upper() == name and \
-               not self.identifier_preparer._requires_quotes(name.lower()):
-             return name.lower()
-@@ -780,16 +780,16 @@
-             return None
-         elif name.lower() == name and not self.identifier_preparer._requires_quotes(name.lower()):
-             name = name.upper()
--        # Py2K
--        if not self.supports_unicode_binds:
--            name = name.encode(self.encoding)
--        else:
--            name = unicode(name)
--        # end Py2K
-+# start Py2K
-+#        if not self.supports_unicode_binds:
-+#            name = name.encode(self.encoding)
-+#        else:
-+#            name = unicode(name)
-+# end Py2K
-         return name
-
-     def _get_default_schema_name(self, connection):
--        return self.normalize_name(connection.execute(u'SELECT USER FROM DUAL').scalar())
-+        return self.normalize_name(connection.execute('SELECT USER FROM DUAL').scalar())
-
-     def _resolve_synonym(self, connection, desired_owner=None, desired_synonym=None, desired_table=None):
-         """search for a local synonym matching the given desired owner/name.
-@@ -1167,7 +1167,7 @@
-                 local_cols.append(local_column)
-                 remote_cols.append(remote_column)
-
--        return fkeys.values()
-+        return list(fkeys.values())
-
-     @reflection.cache
-     def get_view_definition(self, connection, view_name, schema=None,
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/oracle/cx_oracle.py
---- a/lib/sqlalchemy/dialects/oracle/cx_oracle.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/oracle/cx_oracle.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -182,7 +182,7 @@
-
- """
-
--from __future__ import absolute_import
-+
-
- from .base import OracleCompiler, OracleDialect, OracleExecutionContext
- from . import base as oracle
-@@ -268,20 +268,21 @@
-
-
- class _NativeUnicodeMixin(object):
--    # Py3K
--    #pass
--    # Py2K
--    def bind_processor(self, dialect):
--        if dialect._cx_oracle_with_unicode:
--            def process(value):
--                if value is None:
--                    return value
--                else:
--                    return unicode(value)
--            return process
--        else:
--            return super(_NativeUnicodeMixin, self).bind_processor(dialect)
--    # end Py2K
-+# start Py3K
-+    pass
-+# end Py3K
-+# start Py2K
-+#    def bind_processor(self, dialect):
-+#        if dialect._cx_oracle_with_unicode:
-+#            def process(value):
-+#                if value is None:
-+#                    return value
-+#                else:
-+#                    return unicode(value)
-+#            return process
-+#        else:
-+#            return super(_NativeUnicodeMixin, self).bind_processor(dialect)
-+# end Py2K
-
-     # we apply a connection output handler that returns
-     # unicode in all cases, so the "native_unicode" flag
-@@ -391,10 +392,10 @@
-                                     (fromname.encode(self.dialect.encoding),
-                                     toname.encode(self.dialect.encoding))
-                                     for fromname, toname in
--                                    quoted_bind_names.items()
-+                                    list(quoted_bind_names.items())
-                                 )
-             for param in self.parameters:
--                for fromname, toname in quoted_bind_names.items():
-+                for fromname, toname in list(quoted_bind_names.items()):
-                     param[toname] = param[fromname]
-                     del param[fromname]
-
-@@ -408,7 +409,7 @@
-
-         # if a single execute, check for outparams
-         if len(self.compiled_parameters) == 1:
--            for bindparam in self.compiled.binds.values():
-+            for bindparam in list(self.compiled.binds.values()):
-                 if bindparam.isoutparam:
-                     dbtype = bindparam.type.dialect_impl(self.dialect).\
-                                     get_dbapi_type(self.dialect.dbapi)
-@@ -437,7 +438,7 @@
-         if hasattr(self, 'out_parameters') and self.compiled.returning:
-             returning_params = dict(
-                                     (k, v.getvalue())
--                                    for k, v in self.out_parameters.items()
-+                                    for k, v in list(self.out_parameters.items())
-                                 )
-             return ReturningResultProxy(self, returning_params)
-
-@@ -456,7 +457,7 @@
-                     len(self.compiled_parameters) == 1:
-                 result.out_parameters = out_parameters = {}
-
--                for bind, name in self.compiled.bind_names.items():
-+                for bind, name in list(self.compiled.bind_names.items()):
-                     if name in self.out_parameters:
-                         type = bind.type
-                         impl_type = type.dialect_impl(self.dialect)
-@@ -472,7 +473,7 @@
-             else:
-                 result.out_parameters = dict(
-                                             (k, v.getvalue())
--                                            for k, v in self.out_parameters.items()
-+                                            for k, v in list(self.out_parameters.items())
-                                         )
-
-         return result
-@@ -493,11 +494,11 @@
-     """
-     def __init__(self, *arg, **kw):
-         OracleExecutionContext_cx_oracle.__init__(self, *arg, **kw)
--        self.statement = unicode(self.statement)
-+        self.statement = str(self.statement)
-
-     def _execute_scalar(self, stmt):
-         return super(OracleExecutionContext_cx_oracle_with_unicode, self).\
--                            _execute_scalar(unicode(stmt))
-+                            _execute_scalar(str(stmt))
-
-
- class ReturningResultProxy(_result.FullyBufferedResultProxy):
-@@ -607,19 +608,19 @@
-             self.supports_unicode_statements = True
-             self.supports_unicode_binds = True
-             self._cx_oracle_with_unicode = True
--            # Py2K
--            # There's really no reason to run with WITH_UNICODE under Python 2.x.
--            # Give the user a hint.
--            util.warn("cx_Oracle is compiled under Python 2.xx using the "
--                        "WITH_UNICODE flag.  Consider recompiling cx_Oracle without "
--                        "this flag, which is in no way necessary for full support of Unicode. "
--                        "Otherwise, all string-holding bind parameters must "
--                        "be explicitly typed using SQLAlchemy's String type or one of its subtypes,"
--                        "or otherwise be passed as Python unicode.  Plain Python strings "
--                        "passed as bind parameters will be silently corrupted by cx_Oracle."
--                        )
--            self.execution_ctx_cls = OracleExecutionContext_cx_oracle_with_unicode
--            # end Py2K
-+# start Py2K
-+#            # There's really no reason to run with WITH_UNICODE under Python 2.x.
-+#            # Give the user a hint.
-+#            util.warn("cx_Oracle is compiled under Python 2.xx using the "
-+#                        "WITH_UNICODE flag.  Consider recompiling cx_Oracle without "
-+#                        "this flag, which is in no way necessary for full support of Unicode. "
-+#                        "Otherwise, all string-holding bind parameters must "
-+#                        "be explicitly typed using SQLAlchemy's String type or one of its subtypes,"
-+#                        "or otherwise be passed as Python unicode.  Plain Python strings "
-+#                        "passed as bind parameters will be silently corrupted by cx_Oracle."
-+#                        )
-+#            self.execution_ctx_cls = OracleExecutionContext_cx_oracle_with_unicode
-+# end Py2K
-         else:
-             self._cx_oracle_with_unicode = False
-
-@@ -731,7 +732,7 @@
-                             arraysize=cursor.arraysize)
-             # allow all strings to come back natively as Unicode
-             elif defaultType in (cx_Oracle.STRING, cx_Oracle.FIXED_CHAR):
--                return cursor.var(unicode, size, cursor.arraysize)
-+                return cursor.var(str, size, cursor.arraysize)
-
-         def on_connect(conn):
-             conn.outputtypehandler = output_type_handler
-@@ -766,20 +767,20 @@
-             twophase=self.allow_twophase,
-             )
-
--        # Py2K
--        if self._cx_oracle_with_unicode:
--            for k, v in opts.items():
--                if isinstance(v, str):
--                    opts[k] = unicode(v)
--        else:
--            for k, v in opts.items():
--                if isinstance(v, unicode):
--                    opts[k] = str(v)
--        # end Py2K
-+# start Py2K
-+#        if self._cx_oracle_with_unicode:
-+#            for k, v in opts.items():
-+#                if isinstance(v, str):
-+#                    opts[k] = unicode(v)
-+#        else:
-+#            for k, v in opts.items():
-+#                if isinstance(v, unicode):
-+#                    opts[k] = str(v)
-+# end Py2K
-
-         if 'mode' in url.query:
-             opts['mode'] = url.query['mode']
--            if isinstance(opts['mode'], basestring):
-+            if isinstance(opts['mode'], str):
-                 mode = opts['mode'].upper()
-                 if mode == 'SYSDBA':
-                     opts['mode'] = self.dbapi.SYSDBA
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/oracle/zxjdbc.py
---- a/lib/sqlalchemy/dialects/oracle/zxjdbc.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/oracle/zxjdbc.py Sat Apr 27 19:42:17 2013 -0400
-@@ -95,8 +95,8 @@
-             try:
-                 try:
-                     rrs = self.statement.__statement__.getReturnResultSet()
--                    rrs.next()
--                except SQLException, sqle:
-+                    next(rrs)
-+                except SQLException as sqle:
-                     msg = '%s [SQLCode: %d]' % (sqle.getMessage(), sqle.getErrorCode())
-                     if sqle.getSQLState() is not None:
-                         msg += ' [SQLState: %s]' % sqle.getSQLState()
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/postgresql/base.py
---- a/lib/sqlalchemy/dialects/postgresql/base.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/postgresql/base.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -1419,7 +1419,7 @@
-                 query,
-                 bindparams=[
-                     sql.bindparam(
--                        'schema', unicode(schema.lower()),
-+                        'schema', str(schema.lower()),
-                         type_=sqltypes.Unicode)]
-             )
-         )
-@@ -1435,7 +1435,7 @@
-                 "n.oid=c.relnamespace where n.nspname=current_schema() and "
-                 "relname=:name",
-                 bindparams=[
--                        sql.bindparam('name', unicode(table_name),
-+                        sql.bindparam('name', str(table_name),
-                         type_=sqltypes.Unicode)]
-                 )
-             )
-@@ -1447,9 +1447,9 @@
-                 "relname=:name",
-                     bindparams=[
-                         sql.bindparam('name',
--                        unicode(table_name), type_=sqltypes.Unicode),
-+                        str(table_name), type_=sqltypes.Unicode),
-                         sql.bindparam('schema',
--                        unicode(schema), type_=sqltypes.Unicode)]
-+                        str(schema), type_=sqltypes.Unicode)]
-                 )
-             )
-         return bool(cursor.first())
-@@ -1463,7 +1463,7 @@
-                     "n.nspname=current_schema() "
-                     "and relname=:name",
-                     bindparams=[
--                        sql.bindparam('name', unicode(sequence_name),
-+                        sql.bindparam('name', str(sequence_name),
-                         type_=sqltypes.Unicode)
-                     ]
-                 )
-@@ -1475,10 +1475,10 @@
-                 "n.oid=c.relnamespace where relkind='S' and "
-                 "n.nspname=:schema and relname=:name",
-                 bindparams=[
--                    sql.bindparam('name', unicode(sequence_name),
-+                    sql.bindparam('name', str(sequence_name),
-                      type_=sqltypes.Unicode),
-                     sql.bindparam('schema',
--                                unicode(schema), type_=sqltypes.Unicode)
-+                                str(schema), type_=sqltypes.Unicode)
-                 ]
-             )
-             )
-@@ -1488,9 +1488,9 @@
-     def has_type(self, connection, type_name, schema=None):
-         bindparams = [
-             sql.bindparam('typname',
--                unicode(type_name), type_=sqltypes.Unicode),
-+                str(type_name), type_=sqltypes.Unicode),
-             sql.bindparam('nspname',
--                unicode(schema), type_=sqltypes.Unicode),
-+                str(schema), type_=sqltypes.Unicode),
-             ]
-         if schema is not None:
-             query = """
-@@ -1546,9 +1546,9 @@
-         """ % schema_where_clause
-         # Since we're binding to unicode, table_name and schema_name must be
-         # unicode.
--        table_name = unicode(table_name)
-+        table_name = str(table_name)
-         if schema is not None:
--            schema = unicode(schema)
-+            schema = str(schema)
-         s = sql.text(query, bindparams=[
-             sql.bindparam('table_name', type_=sqltypes.Unicode),
-             sql.bindparam('schema', type_=sqltypes.Unicode)
-@@ -1570,13 +1570,14 @@
-         """
-         rp = connection.execute(s)
-         # what about system tables?
--        # Py3K
--        #schema_names = [row[0] for row in rp \
--        #                if not row[0].startswith('pg_')]
--        # Py2K
--        schema_names = [row[0].decode(self.encoding) for row in rp \
-+# start Py3K
-+        schema_names = [row[0] for row in rp \
-                         if not row[0].startswith('pg_')]
--        # end Py2K
-+# end Py3K
-+# start Py2K
-+#        schema_names = [row[0].decode(self.encoding) for row in rp \
-+#                        if not row[0].startswith('pg_')]
-+# end Py2K
-         return schema_names
-
-     @reflection.cache
-@@ -1587,7 +1588,7 @@
-             current_schema = self.default_schema_name
-
-         result = connection.execute(
--            sql.text(u"SELECT relname FROM pg_class c "
-+            sql.text("SELECT relname FROM pg_class c "
-                 "WHERE relkind = 'r' "
-                 "AND '%s' = (select nspname from pg_namespace n "
-                 "where n.oid = c.relnamespace) " %
-@@ -1610,12 +1611,13 @@
-           AND '%(schema)s' = (select nspname from pg_namespace n
-           where n.oid = c.relnamespace)
-         """ % dict(schema=current_schema)
--        # Py3K
--        #view_names = [row[0] for row in connection.execute(s)]
--        # Py2K
--        view_names = [row[0].decode(self.encoding)
--                            for row in connection.execute(s)]
--        # end Py2K
-+# start Py3K
-+        view_names = [row[0] for row in connection.execute(s)]
-+# end Py3K
-+# start Py2K
-+#        view_names = [row[0].decode(self.encoding)
-+#                            for row in connection.execute(s)]
-+# end Py2K
-         return view_names
-
-     @reflection.cache
-@@ -1632,11 +1634,12 @@
-         rp = connection.execute(sql.text(s),
-                                 view_name=view_name, schema=current_schema)
-         if rp:
--            # Py3K
--            #view_def = rp.scalar()
--            # Py2K
--            view_def = rp.scalar().decode(self.encoding)
--            # end Py2K
-+# start Py3K
-+            view_def = rp.scalar()
-+# end Py3K
-+# start Py2K
-+#            view_def = rp.scalar().decode(self.encoding)
-+# end Py2K
-             return view_def
-
-     @reflection.cache
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/postgresql/hstore.py
---- a/lib/sqlalchemy/dialects/postgresql/hstore.py     Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/postgresql/hstore.py     Sat Apr 27 19:42:17 2013 -0400
-@@ -96,14 +96,14 @@
-     def esc(s, position):
-         if position == 'value' and s is None:
-             return 'NULL'
--        elif isinstance(s, basestring):
-+        elif isinstance(s, str):
-             return '"%s"' % s.replace('"', r'\"')
-         else:
-             raise ValueError("%r in %s position is not a string." %
-                              (s, position))
-
-     return ', '.join('%s=>%s' % (esc(k, 'key'), esc(v, 'value'))
--                     for k, v in val.iteritems())
-+                     for k, v in val.items())
-
-
- class HSTORE(sqltypes.Concatenable, sqltypes.TypeEngine):
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/postgresql/psycopg2.py
---- a/lib/sqlalchemy/dialects/postgresql/psycopg2.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/postgresql/psycopg2.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -142,7 +142,7 @@
- effect for other DBAPIs.
-
- """
--from __future__ import absolute_import
-+
- import re
- import logging
-
-@@ -190,22 +190,22 @@
- class _PGEnum(ENUM):
-     def __init__(self, *arg, **kw):
-         super(_PGEnum, self).__init__(*arg, **kw)
--        # Py2K
--        if self.convert_unicode:
--            self.convert_unicode = "force"
--        # end Py2K
-+# start Py2K
-+#        if self.convert_unicode:
-+#            self.convert_unicode = "force"
-+# end Py2K
-
-
- class _PGArray(ARRAY):
-     def __init__(self, *arg, **kw):
-         super(_PGArray, self).__init__(*arg, **kw)
--        # Py2K
--        # FIXME: this check won't work for setups that
--        # have convert_unicode only on their create_engine().
--        if isinstance(self.item_type, sqltypes.String) and \
--                    self.item_type.convert_unicode:
--            self.item_type.convert_unicode = "force"
--        # end Py2K
-+# start Py2K
-+#        # FIXME: this check won't work for setups that
-+#        # have convert_unicode only on their create_engine().
-+#        if isinstance(self.item_type, sqltypes.String) and \
-+#                    self.item_type.convert_unicode:
-+#            self.item_type.convert_unicode = "force"
-+# end Py2K
-
-
- class _PGHStore(HSTORE):
-@@ -294,9 +294,9 @@
-
- class PGDialect_psycopg2(PGDialect):
-     driver = 'psycopg2'
--    # Py2K
--    supports_unicode_statements = False
--    # end Py2K
-+# start Py2K
-+#    supports_unicode_statements = False
-+# end Py2K
-     default_paramstyle = 'pyformat'
-     supports_sane_multi_rowcount = False
-     execution_ctx_cls = PGExecutionContext_psycopg2
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/sqlite/base.py
---- a/lib/sqlalchemy/dialects/sqlite/base.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/sqlite/base.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -508,7 +508,7 @@
-
-     def visit_foreign_key_constraint(self, constraint):
-
--        local_table = constraint._elements.values()[0].parent.table
-+        local_table = list(constraint._elements.values())[0].parent.table
-         remote_table = list(constraint._elements.values())[0].column.table
-
-         if local_table.schema != remote_table.schema:
-@@ -812,7 +812,7 @@
-             coltype = sqltypes.NullType()
-
-         if default is not None:
--            default = unicode(default)
-+            default = str(default)
-
-         return {
-             'name': name,
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/sqlite/pysqlite.py
---- a/lib/sqlalchemy/dialects/sqlite/pysqlite.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/sqlite/pysqlite.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -267,8 +267,9 @@
-         }
-     )
-
--    # Py3K
--    #description_encoding = None
-+# start Py3K
-+    description_encoding = None
-+# end Py3K
-
-     driver = 'pysqlite'
-
-@@ -288,7 +289,7 @@
-     def dbapi(cls):
-         try:
-             from pysqlite2 import dbapi2 as sqlite
--        except ImportError, e:
-+        except ImportError as e:
-             try:
-                 from sqlite3 import dbapi2 as sqlite  # try 2.5+ stdlib name.
-             except ImportError:
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/sybase/__init__.py
---- a/lib/sqlalchemy/dialects/sybase/__init__.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/sybase/__init__.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -9,7 +9,7 @@
- # default dialect
- base.dialect = pyodbc.dialect
-
--from base import CHAR, VARCHAR, TIME, NCHAR, NVARCHAR,\
-+from .base import CHAR, VARCHAR, TIME, NCHAR, NVARCHAR,\
-                  TEXT, DATE, DATETIME, FLOAT, NUMERIC,\
-                  BIGINT, INT, INTEGER, SMALLINT, BINARY,\
-                  VARBINARY, UNITEXT, UNICHAR, UNIVARCHAR,\
-diff -r 9d0639b9d3be lib/sqlalchemy/dialects/sybase/base.py
---- a/lib/sqlalchemy/dialects/sybase/base.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/dialects/sybase/base.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -475,12 +475,12 @@
-               AND o.type in ('U', 'V')
-         """)
-
--        # Py2K
--        if isinstance(schema, unicode):
--            schema = schema.encode("ascii")
--        if isinstance(table_name, unicode):
--            table_name = table_name.encode("ascii")
--        # end Py2K
-+# start Py2K
-+#        if isinstance(schema, unicode):
-+#            schema = schema.encode("ascii")
-+#        if isinstance(table_name, unicode):
-+#            table_name = table_name.encode("ascii")
-+# end Py2K
-         result = connection.execute(TABLEID_SQL,
-                                     schema_name=schema,
-                                     table_name=table_name)
-@@ -759,10 +759,10 @@
-             AND o.type = 'U'
-         """)
-
--        # Py2K
--        if isinstance(schema, unicode):
--            schema = schema.encode("ascii")
--        # end Py2K
-+# start Py2K
-+#        if isinstance(schema, unicode):
-+#            schema = schema.encode("ascii")
-+# end Py2K
-         tables = connection.execute(TABLE_SQL, schema_name=schema)
-
-         return [t["name"] for t in tables]
-@@ -779,10 +779,10 @@
-             AND o.type = 'V'
-         """)
-
--        # Py2K
--        if isinstance(view_name, unicode):
--            view_name = view_name.encode("ascii")
--        # end Py2K
-+# start Py2K
-+#        if isinstance(view_name, unicode):
-+#            view_name = view_name.encode("ascii")
-+# end Py2K
-         view = connection.execute(VIEW_DEF_SQL, view_name=view_name)
-
-         return view.scalar()
-@@ -799,10 +799,10 @@
-             AND o.type = 'V'
-         """)
-
--        # Py2K
--        if isinstance(schema, unicode):
--            schema = schema.encode("ascii")
--        # end Py2K
-+# start Py2K
-+#        if isinstance(schema, unicode):
-+#            schema = schema.encode("ascii")
-+# end Py2K
-         views = connection.execute(VIEW_SQL, schema_name=schema)
-
-         return [v["name"] for v in views]
-diff -r 9d0639b9d3be lib/sqlalchemy/engine/base.py
---- a/lib/sqlalchemy/engine/base.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/engine/base.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -9,7 +9,7 @@
-
- """
-
--from __future__ import with_statement
-+
- import sys
- from .. import exc, schema, util, log, interfaces
- from ..sql import expression, util as sql_util
-@@ -460,7 +460,7 @@
-
-         try:
-             self.engine.dialect.do_begin(self.connection)
--        except Exception, e:
-+        except Exception as e:
-             self._handle_dbapi_exception(e, None, None, None, None)
-
-     def _rollback_impl(self):
-@@ -473,7 +473,7 @@
-             try:
-                 self.engine.dialect.do_rollback(self.connection)
-                 self.__transaction = None
--            except Exception, e:
-+            except Exception as e:
-                 self._handle_dbapi_exception(e, None, None, None, None)
-         else:
-             self.__transaction = None
-@@ -487,7 +487,7 @@
-         try:
-             self.engine.dialect.do_commit(self.connection)
-             self.__transaction = None
--        except Exception, e:
-+        except Exception as e:
-             self._handle_dbapi_exception(e, None, None, None, None)
-
-     def _savepoint_impl(self, name=None):
-@@ -688,7 +688,7 @@
-             dialect = self.dialect
-             ctx = dialect.execution_ctx_cls._init_default(
-                                 dialect, self, conn)
--        except Exception, e:
-+        except Exception as e:
-             self._handle_dbapi_exception(e, None, None, None, None)
-
-         ret = ctx._exec_default(default, None)
-@@ -734,7 +734,7 @@
-
-         distilled_params = _distill_params(multiparams, params)
-         if distilled_params:
--            keys = distilled_params[0].keys()
-+            keys = list(distilled_params[0].keys())
-         else:
-             keys = []
-
-@@ -822,7 +822,7 @@
-                 conn = self._revalidate_connection()
-
-             context = constructor(dialect, self, conn, *args)
--        except Exception, e:
-+        except Exception as e:
-             self._handle_dbapi_exception(e,
-                         str(statement), parameters,
-                         None, None)
-@@ -865,7 +865,7 @@
-                                     statement,
-                                     parameters,
-                                     context)
--        except Exception, e:
-+        except Exception as e:
-             self._handle_dbapi_exception(
-                                 e,
-                                 statement,
-@@ -939,7 +939,7 @@
-                                 cursor,
-                                 statement,
-                                 parameters)
--        except Exception, e:
-+        except Exception as e:
-             self._handle_dbapi_exception(
-                                 e,
-                                 statement,
-@@ -954,7 +954,7 @@
-         """
-         try:
-             cursor.close()
--        except Exception, e:
-+        except Exception as e:
-             try:
-                 ex_text = str(e)
-             except TypeError:
-@@ -1045,7 +1045,7 @@
-         Compiled: _execute_compiled,
-         schema.SchemaItem: _execute_default,
-         schema.DDLElement: _execute_ddl,
--        basestring: _execute_text
-+        str: _execute_text
-     }
-
-     def default_schema_name(self):
-diff -r 9d0639b9d3be lib/sqlalchemy/engine/ddl.py
---- a/lib/sqlalchemy/engine/ddl.py     Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/engine/ddl.py     Sat Apr 27 19:42:17 2013 -0400
-@@ -52,10 +52,10 @@
-         if self.tables is not None:
-             tables = self.tables
-         else:
--            tables = metadata.tables.values()
-+            tables = list(metadata.tables.values())
-         collection = [t for t in sql_util.sort_tables(tables)
-                         if self._can_create_table(t)]
--        seq_coll = [s for s in metadata._sequences.values()
-+        seq_coll = [s for s in list(metadata._sequences.values())
-                         if s.column is None and self._can_create_sequence(s)]
-
-         metadata.dispatch.before_create(metadata, self.connection,
-@@ -120,7 +120,7 @@
-         if self.tables is not None:
-             tables = self.tables
-         else:
--            tables = metadata.tables.values()
-+            tables = list(metadata.tables.values())
-
-         collection = [
-             t
-@@ -130,7 +130,7 @@
-
-         seq_coll = [
-             s
--            for s in metadata._sequences.values()
-+            for s in list(metadata._sequences.values())
-             if s.column is None and self._can_drop_sequence(s)
-         ]
-
-diff -r 9d0639b9d3be lib/sqlalchemy/engine/default.py
---- a/lib/sqlalchemy/engine/default.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/engine/default.py Sat Apr 27 19:42:17 2013 -0400
-@@ -57,17 +57,18 @@
-     # *not* the FLOAT type however.
-     supports_native_decimal = False
-
--    # Py3K
--    #supports_unicode_statements = True
--    #supports_unicode_binds = True
--    #returns_unicode_strings = True
--    #description_encoding = None
--    # Py2K
--    supports_unicode_statements = False
--    supports_unicode_binds = False
--    returns_unicode_strings = False
--    description_encoding = 'use_encoding'
--    # end Py2K
-+# start Py3K
-+    supports_unicode_statements = True
-+    supports_unicode_binds = True
-+    returns_unicode_strings = True
-+    description_encoding = None
-+# end Py3K
-+# start Py2K
-+#    supports_unicode_statements = False
-+#    supports_unicode_binds = False
-+#    returns_unicode_strings = False
-+#    description_encoding = 'use_encoding'
-+# end Py2K
-
-     name = 'default'
-
-@@ -201,14 +202,15 @@
-         return None
-
-     def _check_unicode_returns(self, connection):
--        # Py2K
--        if self.supports_unicode_statements:
--            cast_to = unicode
--        else:
--            cast_to = str
--        # end Py2K
--        # Py3K
--        #cast_to = str
-+# start Py2K
-+#        if self.supports_unicode_statements:
-+#            cast_to = unicode
-+#        else:
-+#            cast_to = str
-+# end Py2K
-+# start Py3K
-+        cast_to = str
-+# end Py3K
-
-         def check_unicode(formatstr, type_):
-             cursor = connection.connection.cursor()
-@@ -226,8 +228,8 @@
-                     )
-                     row = cursor.fetchone()
-
--                    return isinstance(row[0], unicode)
--                except self.dbapi.Error, de:
-+                    return isinstance(row[0], str)
-+                except self.dbapi.Error as de:
-                     util.warn("Exception attempting to "
-                             "detect unicode returns: %r" % de)
-                     return False
-@@ -373,10 +375,10 @@
-             self.execution_options.update(connection._execution_options)
-
-         if not dialect.supports_unicode_statements:
--            self.unicode_statement = unicode(compiled)
-+            self.unicode_statement = str(compiled)
-             self.statement = dialect._encoder(self.unicode_statement)[0]
-         else:
--            self.statement = self.unicode_statement = unicode(compiled)
-+            self.statement = self.unicode_statement = str(compiled)
-
-         self.cursor = self.create_cursor()
-         self.compiled_parameters = []
-@@ -414,7 +416,7 @@
-
-         self.result_map = compiled.result_map
-
--        self.unicode_statement = unicode(compiled)
-+        self.unicode_statement = str(compiled)
-         if not dialect.supports_unicode_statements:
-             self.statement = self.unicode_statement.encode(
-                                         self.dialect.encoding)
-@@ -519,7 +521,7 @@
-         self.executemany = len(parameters) > 1
-
-         if not dialect.supports_unicode_statements and \
--            isinstance(statement, unicode):
-+            isinstance(statement, str):
-             self.unicode_statement = statement
-             self.statement = dialect._encoder(statement)[0]
-         else:
-@@ -573,7 +575,7 @@
-         """
-
-         conn = self.root_connection
--        if isinstance(stmt, unicode) and \
-+        if isinstance(stmt, str) and \
-             not self.dialect.supports_unicode_statements:
-             stmt = self.dialect._encoder(stmt)[0]
-
-@@ -734,12 +736,12 @@
-                     inputsizes.append(dbtype)
-             try:
-                 self.cursor.setinputsizes(*inputsizes)
--            except Exception, e:
-+            except Exception as e:
-                 self.root_connection._handle_dbapi_exception(
-                                 e, None, None, None, self)
-         else:
-             inputsizes = {}
--            for key in self.compiled.bind_names.values():
-+            for key in list(self.compiled.bind_names.values()):
-                 typeengine = types[key]
-                 dbtype = typeengine.dialect_impl(self.dialect).\
-                                 get_dbapi_type(self.dialect.dbapi)
-@@ -752,7 +754,7 @@
-                     inputsizes[key] = dbtype
-             try:
-                 self.cursor.setinputsizes(**inputsizes)
--            except Exception, e:
-+            except Exception as e:
-                 self.root_connection._handle_dbapi_exception(
-                                 e, None, None, None, self)
-
-diff -r 9d0639b9d3be lib/sqlalchemy/engine/reflection.py
---- a/lib/sqlalchemy/engine/reflection.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/engine/reflection.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -41,8 +41,8 @@
-         return fn(self, con, *args, **kw)
-     key = (
-             fn.__name__,
--            tuple(a for a in args if isinstance(a, basestring)),
--            tuple((k, v) for k, v in kw.iteritems() if isinstance(v, (basestring, int, float)))
-+            tuple(a for a in args if isinstance(a, str)),
-+            tuple((k, v) for k, v in kw.items() if isinstance(v, (str, int, float)))
-         )
-     ret = info_cache.get(key)
-     if ret is None:
-@@ -381,16 +381,16 @@
-         # table.kwargs will need to be passed to each reflection method.  Make
-         # sure keywords are strings.
-         tblkw = table.kwargs.copy()
--        for (k, v) in tblkw.items():
-+        for (k, v) in list(tblkw.items()):
-             del tblkw[k]
-             tblkw[str(k)] = v
-
--        # Py2K
--        if isinstance(schema, str):
--            schema = schema.decode(dialect.encoding)
--        if isinstance(table_name, str):
--            table_name = table_name.decode(dialect.encoding)
--        # end Py2K
-+# start Py2K
-+#        if isinstance(schema, str):
-+#            schema = schema.decode(dialect.encoding)
-+#        if isinstance(table_name, str):
-+#            table_name = table_name.decode(dialect.encoding)
-+# end Py2K
-
-         # columns
-         found_table = False
-diff -r 9d0639b9d3be lib/sqlalchemy/engine/result.py
---- a/lib/sqlalchemy/engine/result.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/engine/result.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -8,7 +8,7 @@
- and :class:`.RowProxy."""
-
-
--from itertools import izip
-+
- from .. import exc, types, util
- from ..sql import expression
- import collections
-@@ -55,7 +55,7 @@
-             return list(self)
-
-         def __iter__(self):
--            for processor, value in izip(self._processors, self._row):
-+            for processor, value in zip(self._processors, self._row):
-                 if processor is None:
-                     yield value
-                 else:
-@@ -72,7 +72,7 @@
-             except TypeError:
-                 if isinstance(key, slice):
-                     l = []
--                    for processor, value in izip(self._processors[key],
-+                    for processor, value in zip(self._processors[key],
-                                                  self._row[key]):
-                         if processor is None:
-                             l.append(value)
-@@ -93,7 +93,7 @@
-         def __getattr__(self, name):
-             try:
-                 return self[name]
--            except KeyError, e:
-+            except KeyError as e:
-                 raise AttributeError(e.args[0])
-
-
-@@ -142,7 +142,7 @@
-     def items(self):
-         """Return a list of tuples, each tuple containing a key/value pair."""
-         # TODO: no coverage here
--        return [(key, self[key]) for key in self.iterkeys()]
-+        return [(key, self[key]) for key in self.keys()]
-
-     def keys(self):
-         """Return the list of keys as strings represented by this RowProxy."""
-@@ -274,7 +274,7 @@
-     def _key_fallback(self, key, raiseerr=True):
-         map = self._keymap
-         result = None
--        if isinstance(key, basestring):
-+        if isinstance(key, str):
-             result = map.get(key if self.case_sensitive else key.lower())
-         # fallback for targeting a ColumnElement to a textual expression
-         # this is a rare use case which only occurs when matching text()
-@@ -328,8 +328,8 @@
-         return {
-             '_pickled_keymap': dict(
-                 (key, index)
--                for key, (processor, obj, index) in self._keymap.iteritems()
--                if isinstance(key, (basestring, int))
-+                for key, (processor, obj, index) in self._keymap.items()
-+                if isinstance(key, (str, int))
-             ),
-             'keys': self.keys,
-             "case_sensitive": self.case_sensitive,
-@@ -338,9 +338,9 @@
-     def __setstate__(self, state):
-         # the row has been processed at pickling time so we don't need any
-         # processor anymore
--        self._processors = [None for _ in xrange(len(state['keys']))]
-+        self._processors = [None for _ in range(len(state['keys']))]
-         self._keymap = keymap = {}
--        for key, index in state['_pickled_keymap'].iteritems():
-+        for key, index in state['_pickled_keymap'].items():
-             # not preserving "obj" here, unfortunately our
-             # proxy comparison fails with the unpickle
-             keymap[key] = (None, None, index)
-@@ -440,7 +440,7 @@
-         """
-         try:
-             return self.context.rowcount
--        except Exception, e:
-+        except Exception as e:
-             self.connection._handle_dbapi_exception(
-                               e, None, None, self.cursor, self.context)
-
-@@ -462,7 +462,7 @@
-         """
-         try:
-             return self._saved_cursor.lastrowid
--        except Exception, e:
-+        except Exception as e:
-             self.connection._handle_dbapi_exception(
-                                  e, None, None,
-                                  self._saved_cursor, self.context)
-@@ -746,7 +746,7 @@
-             l = self.process_rows(self._fetchall_impl())
-             self.close()
-             return l
--        except Exception, e:
-+        except Exception as e:
-             self.connection._handle_dbapi_exception(
-                                     e, None, None,
-                                     self.cursor, self.context)
-@@ -765,7 +765,7 @@
-             if len(l) == 0:
-                 self.close()
-             return l
--        except Exception, e:
-+        except Exception as e:
-             self.connection._handle_dbapi_exception(
-                                     e, None, None,
-                                     self.cursor, self.context)
-@@ -784,7 +784,7 @@
-             else:
-                 self.close()
-                 return None
--        except Exception, e:
-+        except Exception as e:
-             self.connection._handle_dbapi_exception(
-                                     e, None, None,
-                                     self.cursor, self.context)
-@@ -800,7 +800,7 @@
-
-         try:
-             row = self._fetchone_impl()
--        except Exception, e:
-+        except Exception as e:
-             self.connection._handle_dbapi_exception(
-                                     e, None, None,
-                                     self.cursor, self.context)
-@@ -966,9 +966,9 @@
-         # constructed.
-         metadata._orig_processors = metadata._processors
-         # replace the all type processors by None processors.
--        metadata._processors = [None for _ in xrange(len(metadata.keys))]
-+        metadata._processors = [None for _ in range(len(metadata.keys))]
-         keymap = {}
--        for k, (func, obj, index) in metadata._keymap.iteritems():
-+        for k, (func, obj, index) in metadata._keymap.items():
-             keymap[k] = (None, obj, index)
-         self._metadata._keymap = keymap
-
-@@ -989,7 +989,7 @@
-         if size is None:
-             return self.fetchall()
-         l = []
--        for i in xrange(size):
-+        for i in range(size):
-             row = self.fetchone()
-             if row is None:
-                 break
-diff -r 9d0639b9d3be lib/sqlalchemy/engine/strategies.py
---- a/lib/sqlalchemy/engine/strategies.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/engine/strategies.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -78,20 +78,21 @@
-             def connect():
-                 try:
-                     return dialect.connect(*cargs, **cparams)
--                except Exception, e:
-+                except Exception as e:
-                     invalidated = dialect.is_disconnect(e, None, None)
--                    # Py3K
--                    #raise exc.DBAPIError.instance(None, None,
--                    #    e, dialect.dbapi.Error,
--                    #    connection_invalidated=invalidated
--                    #) from e
--                    # Py2K
--                    import sys
--                    raise exc.DBAPIError.instance(
--                        None, None, e, dialect.dbapi.Error,
-+# start Py3K
-+                    raise exc.DBAPIError.instance(None, None,
-+                        e, dialect.dbapi.Error,
-                         connection_invalidated=invalidated
--                    ), None, sys.exc_info()[2]
--                    # end Py2K
-+                    ) from e
-+# end Py3K
-+# start Py2K
-+#                    import sys
-+#                    raise exc.DBAPIError.instance(
-+#                        None, None, e, dialect.dbapi.Error,
-+#                        connection_invalidated=invalidated
-+#                    ), None, sys.exc_info()[2]
-+# end Py2K
-
-             creator = kwargs.pop('creator', connect)
-
-diff -r 9d0639b9d3be lib/sqlalchemy/engine/url.py
---- a/lib/sqlalchemy/engine/url.py     Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/engine/url.py     Sat Apr 27 19:42:17 2013 -0400
-@@ -14,7 +14,7 @@
- """
-
- import re
--import urllib
-+import urllib.request, urllib.parse, urllib.error
- from .. import exc, util
- from . import Dialect
-
-@@ -67,7 +67,7 @@
-         if self.username is not None:
-             s += self.username
-             if self.password is not None:
--                s += ':' + urllib.quote_plus(self.password)
-+                s += ':' + urllib.parse.quote_plus(self.password)
-             s += "@"
-         if self.host is not None:
-             s += self.host
-@@ -76,7 +76,7 @@
-         if self.database is not None:
-             s += '/' + self.database
-         if self.query:
--            keys = self.query.keys()
-+            keys = list(self.query.keys())
-             keys.sort()
-             s += '?' + "&".join("%s=%s" % (k, self.query[k]) for k in keys)
-         return s
-@@ -150,7 +150,7 @@
-     existing URL object is passed, just returns the object.
-     """
-
--    if isinstance(name_or_url, basestring):
-+    if isinstance(name_or_url, str):
-         return _parse_rfc1738_args(name_or_url)
-     else:
-         return name_or_url
-@@ -177,17 +177,17 @@
-             tokens = components['database'].split('?', 2)
-             components['database'] = tokens[0]
-             query = (len(tokens) > 1 and dict(util.parse_qsl(tokens[1]))) or None
--            # Py2K
--            if query is not None:
--                query = dict((k.encode('ascii'), query[k]) for k in query)
--            # end Py2K
-+# start Py2K
-+#            if query is not None:
-+#                query = dict((k.encode('ascii'), query[k]) for k in query)
-+# end Py2K
-         else:
-             query = None
-         components['query'] = query
-
-         if components['password'] is not None:
-             components['password'] = \
--                urllib.unquote_plus(components['password'])
-+                urllib.parse.unquote_plus(components['password'])
-
-         name = components.pop('name')
-         return URL(name, **components)
-diff -r 9d0639b9d3be lib/sqlalchemy/event.py
---- a/lib/sqlalchemy/event.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/event.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -201,11 +201,9 @@
-                 del _registrars[k]
-
-
--class Events(object):
-+class Events(object, metaclass=_EventMeta):
-     """Define event listening functions for a particular target type."""
-
--    __metaclass__ = _EventMeta
--
-     @classmethod
-     def _accept_with(cls, target):
-         # Mapper, ClassManager, Session override this to
-@@ -302,7 +300,7 @@
-     def clear(self):
-         """Clear all class level listeners"""
-
--        for dispatcher in self._clslevel.values():
-+        for dispatcher in list(self._clslevel.values()):
-             dispatcher[:] = []
-
-     def for_modify(self, obj):
-@@ -377,7 +375,7 @@
-     def __iter__(self):
-         return iter(self.parent_listeners)
-
--    def __nonzero__(self):
-+    def __bool__(self):
-         return bool(self.parent_listeners)
-
-
-@@ -414,7 +412,7 @@
-     def __iter__(self):
-         return chain(self.parent_listeners, self.listeners)
-
--    def __nonzero__(self):
-+    def __bool__(self):
-         return bool(self.listeners or self.parent_listeners)
-
-
-diff -r 9d0639b9d3be lib/sqlalchemy/exc.py
---- a/lib/sqlalchemy/exc.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/exc.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -285,7 +285,7 @@
-             text = str(orig)
-         except (KeyboardInterrupt, SystemExit):
-             raise
--        except Exception, e:
-+        except Exception as e:
-             text = 'Error in str() of DB-API-generated exception: ' + str(e)
-         StatementError.__init__(
-                 self,
-diff -r 9d0639b9d3be lib/sqlalchemy/ext/associationproxy.py
---- a/lib/sqlalchemy/ext/associationproxy.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/ext/associationproxy.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -475,7 +475,7 @@
-     def __len__(self):
-         return len(self.col)
-
--    def __nonzero__(self):
-+    def __bool__(self):
-         return bool(self.col)
-
-     def __getstate__(self):
-@@ -514,7 +514,7 @@
-                 stop = index.stop
-             step = index.step or 1
-
--            rng = range(index.start or 0, stop, step)
-+            rng = list(range(index.start or 0, stop, step))
-             if step == 1:
-                 for i in rng:
-                     del self[index.start]
-@@ -569,7 +569,7 @@
-
-     def count(self, value):
-         return sum([1 for _ in
--                    itertools.ifilter(lambda v: v == value, iter(self))])
-+                    filter(lambda v: v == value, iter(self))])
-
-     def extend(self, values):
-         for v in values:
-@@ -668,8 +668,8 @@
-     def __hash__(self):
-         raise TypeError("%s objects are unhashable" % type(self).__name__)
-
--    for func_name, func in locals().items():
--        if (util.callable(func) and func.func_name == func_name and
-+    for func_name, func in list(locals().items()):
-+        if (util.callable(func) and func.__name__ == func_name and
-             not func.__doc__ and hasattr(list, func_name)):
-             func.__doc__ = getattr(list, func_name).__doc__
-     del func_name, func
-@@ -711,7 +711,7 @@
-         return key in self.col
-
-     def __iter__(self):
--        return self.col.iterkeys()
-+        return iter(self.col.keys())
-
-     def clear(self):
-         self.col.clear()
-@@ -738,7 +738,7 @@
-         return cmp(dict(self), other)
-
-     def __repr__(self):
--        return repr(dict(self.items()))
-+        return repr(dict(list(self.items())))
-
-     def get(self, key, default=None):
-         try:
-@@ -754,13 +754,13 @@
-             return self[key]
-
-     def keys(self):
--        return self.col.keys()
-+        return list(self.col.keys())
-
-     def iterkeys(self):
--        return self.col.iterkeys()
-+        return iter(self.col.keys())
-
-     def values(self):
--        return [self._get(member) for member in self.col.values()]
-+        return [self._get(member) for member in list(self.col.values())]
-
-     def itervalues(self):
-         for key in self.col:
-@@ -811,13 +811,13 @@
-             self[key] = value
-
-     def copy(self):
--        return dict(self.items())
-+        return dict(list(self.items()))
-
-     def __hash__(self):
-         raise TypeError("%s objects are unhashable" % type(self).__name__)
-
--    for func_name, func in locals().items():
--        if (util.callable(func) and func.func_name == func_name and
-+    for func_name, func in list(locals().items()):
-+        if (util.callable(func) and func.__name__ == func_name and
-             not func.__doc__ and hasattr(dict, func_name)):
-             func.__doc__ = getattr(dict, func_name).__doc__
-     del func_name, func
-@@ -838,7 +838,7 @@
-     def __len__(self):
-         return len(self.col)
-
--    def __nonzero__(self):
-+    def __bool__(self):
-         if self.col:
-             return True
-         else:
-@@ -1014,8 +1014,8 @@
-     def __hash__(self):
-         raise TypeError("%s objects are unhashable" % type(self).__name__)
-
--    for func_name, func in locals().items():
--        if (util.callable(func) and func.func_name == func_name and
-+    for func_name, func in list(locals().items()):
-+        if (util.callable(func) and func.__name__ == func_name and
-             not func.__doc__ and hasattr(set, func_name)):
-             func.__doc__ = getattr(set, func_name).__doc__
-     del func_name, func
-diff -r 9d0639b9d3be lib/sqlalchemy/ext/declarative/api.py
---- a/lib/sqlalchemy/ext/declarative/api.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/ext/declarative/api.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -424,7 +424,7 @@
-     def prepare(cls, engine):
-         """Reflect all :class:`.Table` objects for all current
-         :class:`.DeferredReflection` subclasses"""
--        to_map = [m for m in _MapperConfig.configs.values()
-+        to_map = [m for m in list(_MapperConfig.configs.values())
-                     if issubclass(m.cls, cls)]
-         for thingy in to_map:
-             cls._sa_decl_prepare(thingy.local_table, engine)
-diff -r 9d0639b9d3be lib/sqlalchemy/ext/declarative/base.py
---- a/lib/sqlalchemy/ext/declarative/base.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/ext/declarative/base.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -57,7 +57,7 @@
-
-         class_mapped = _declared_mapping_info(base) is not None
-
--        for name, obj in vars(base).items():
-+        for name, obj in list(vars(base).items()):
-             if name == '__mapper_args__':
-                 if not mapper_args_fn and (
-                                         not class_mapped or
-@@ -129,7 +129,7 @@
-                         ret.doc = obj.__doc__
-
-     # apply inherited columns as we should
--    for k, v in potential_columns.items():
-+    for k, v in list(potential_columns.items()):
-         dict_[k] = v
-
-     if inherited_table_args and not tablename:
-@@ -173,7 +173,7 @@
-
-     # extract columns from the class dict
-     declared_columns = set()
--    for key, c in our_stuff.iteritems():
-+    for key, c in our_stuff.items():
-         if isinstance(c, (ColumnProperty, CompositeProperty)):
-             for col in c.columns:
-                 if isinstance(col, Column) and \
-@@ -354,7 +354,7 @@
-             # in which case the mapper makes this combination).
-             # See if the superclass has a similar column property.
-             # If so, join them together.
--            for k, col in properties.items():
-+            for k, col in list(properties.items()):
-                 if not isinstance(col, expression.ColumnElement):
-                     continue
-                 if k in inherited_mapper._props:
-diff -r 9d0639b9d3be lib/sqlalchemy/ext/declarative/clsregistry.py
---- a/lib/sqlalchemy/ext/declarative/clsregistry.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/ext/declarative/clsregistry.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -255,7 +255,7 @@
-                     return x.cls
-                 else:
-                     return x
--            except NameError, n:
-+            except NameError as n:
-                 raise exc.InvalidRequestError(
-                     "When initializing mapper %s, expression %r failed to "
-                     "locate a name (%r). If this is a class name, consider "
-@@ -275,14 +275,14 @@
-         for attr in ('argument', 'order_by', 'primaryjoin', 'secondaryjoin',
-                      'secondary', '_user_defined_foreign_keys', 'remote_side'):
-             v = getattr(prop, attr)
--            if isinstance(v, basestring):
-+            if isinstance(v, str):
-                 setattr(prop, attr, resolve_arg(v))
-
-         if prop.backref and isinstance(prop.backref, tuple):
-             key, kwargs = prop.backref
-             for attr in ('primaryjoin', 'secondaryjoin', 'secondary',
-                          'foreign_keys', 'remote_side', 'order_by'):
--                if attr in kwargs and isinstance(kwargs[attr], basestring):
-+                if attr in kwargs and isinstance(kwargs[attr], str):
-                     kwargs[attr] = resolve_arg(kwargs[attr])
-
-     return prop
-diff -r 9d0639b9d3be lib/sqlalchemy/ext/mutable.py
---- a/lib/sqlalchemy/ext/mutable.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/ext/mutable.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -485,7 +485,7 @@
-     def changed(self):
-         """Subclasses should call this method whenever change events occur."""
-
--        for parent, key in self._parents.items():
-+        for parent, key in list(self._parents.items()):
-             flag_modified(parent, key)
-
-     @classmethod
-@@ -579,7 +579,7 @@
-     def changed(self):
-         """Subclasses should call this method whenever change events occur."""
-
--        for parent, key in self._parents.items():
-+        for parent, key in list(self._parents.items()):
-
-             prop = object_mapper(parent).get_property(key)
-             for value, attr_name in zip(
-diff -r 9d0639b9d3be lib/sqlalchemy/ext/orderinglist.py
---- a/lib/sqlalchemy/ext/orderinglist.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/ext/orderinglist.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -324,7 +324,7 @@
-             if stop < 0:
-                 stop += len(self)
-
--            for i in xrange(start, stop, step):
-+            for i in range(start, stop, step):
-                 self.__setitem__(i, entity[i])
-         else:
-             self._order_entity(index, entity, True)
-@@ -334,21 +334,21 @@
-         super(OrderingList, self).__delitem__(index)
-         self._reorder()
-
--    # Py2K
--    def __setslice__(self, start, end, values):
--        super(OrderingList, self).__setslice__(start, end, values)
--        self._reorder()
--
--    def __delslice__(self, start, end):
--        super(OrderingList, self).__delslice__(start, end)
--        self._reorder()
--    # end Py2K
-+# start Py2K
-+#    def __setslice__(self, start, end, values):
-+#        super(OrderingList, self).__setslice__(start, end, values)
-+#        self._reorder()
-+#
-+#    def __delslice__(self, start, end):
-+#        super(OrderingList, self).__delslice__(start, end)
-+#        self._reorder()
-+# end Py2K
-
-     def __reduce__(self):
-         return _reconstitute, (self.__class__, self.__dict__, list(self))
-
--    for func_name, func in locals().items():
--        if (util.callable(func) and func.func_name == func_name and
-+    for func_name, func in list(locals().items()):
-+        if (util.callable(func) and func.__name__ == func_name and
-             not func.__doc__ and hasattr(list, func_name)):
-             func.__doc__ = getattr(list, func_name).__doc__
-     del func_name, func
-diff -r 9d0639b9d3be lib/sqlalchemy/ext/serializer.py
---- a/lib/sqlalchemy/ext/serializer.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/ext/serializer.py Sat Apr 27 19:42:17 2013 -0400
-@@ -61,20 +61,22 @@
- from ..util import pickle
- import re
- import base64
--# Py3K
--#from io import BytesIO as byte_buffer
--# Py2K
--from cStringIO import StringIO as byte_buffer
-+# start Py3K
-+from io import BytesIO as byte_buffer
-+# end Py3K
-+# start Py2K
-+#from cStringIO import StringIO as byte_buffer
- # end Py2K
-
--# Py3K
--#def b64encode(x):
--#    return base64.b64encode(x).decode('ascii')
--#def b64decode(x):
--#    return base64.b64decode(x.encode('ascii'))
--# Py2K
--b64encode = base64.b64encode
--b64decode = base64.b64decode
-+# start Py3K
-+def b64encode(x):
-+    return base64.b64encode(x).decode('ascii')
-+def b64decode(x):
-+    return base64.b64decode(x.encode('ascii'))
-+# end Py3K
-+# start Py2K
-+#b64encode = base64.b64encode
-+#b64decode = base64.b64decode
- # end Py2K
-
- __all__ = ['Serializer', 'Deserializer', 'dumps', 'loads']
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/__init__.py
---- a/lib/sqlalchemy/orm/__init__.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/__init__.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -1628,7 +1628,7 @@
-     alias = kwargs.pop('alias', None)
-     if kwargs:
-         raise exc.ArgumentError(
--                'Invalid kwargs for contains_eager: %r' % kwargs.keys())
-+                'Invalid kwargs for contains_eager: %r' % list(kwargs.keys()))
-     return strategies.EagerLazyOption(keys, lazy='joined',
-             propagate_to_loaders=False, chained=True), \
-         strategies.LoadEagerFromAliasOption(keys, alias=alias, chained=True)
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/attributes.py
---- a/lib/sqlalchemy/orm/attributes.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/attributes.py Sat Apr 27 19:42:17 2013 -0400
-@@ -1214,7 +1214,7 @@
-
-     """
-
--    def __nonzero__(self):
-+    def __bool__(self):
-         return self != HISTORY_BLANK
-
-     def empty(self):
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/collections.py
---- a/lib/sqlalchemy/orm/collections.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/collections.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -657,11 +657,12 @@
-         if getattr(obj, '_sa_adapter', None) is not None:
-             return getattr(obj, '_sa_adapter')
-         elif setting_type == dict:
--            # Py3K
--            #return obj.values()
--            # Py2K
--            return getattr(obj, 'itervalues', getattr(obj, 'values'))()
--            # end Py2K
-+# start Py3K
-+            return list(obj.values())
-+# end Py3K
-+# start Py2K
-+#            return getattr(obj, 'itervalues', getattr(obj, 'values'))()
-+# end Py2K
-         else:
-             return iter(obj)
-
-@@ -705,14 +706,15 @@
-     def __iter__(self):
-         """Iterate over entities in the collection."""
-
--        # Py3K requires iter() here
-+# start Py3K
-+# end Py3K
-         return iter(getattr(self._data(), '_sa_iterator')())
-
-     def __len__(self):
-         """Count entities in the collection."""
-         return len(list(getattr(self._data(), '_sa_iterator')()))
-
--    def __nonzero__(self):
-+    def __bool__(self):
-         return True
-
-     def fire_append_event(self, item, initiator=None):
-@@ -883,7 +885,7 @@
-     # search for _sa_instrument_role-decorated methods in
-     # method resolution order, assign to roles
-     for supercls in cls.__mro__:
--        for name, method in vars(supercls).items():
-+        for name, method in list(vars(supercls).items()):
-             if not util.callable(method):
-                 continue
-
-@@ -917,11 +919,11 @@
-     collection_type = util.duck_type_collection(cls)
-     if collection_type in __interfaces:
-         canned_roles, decorators = __interfaces[collection_type]
--        for role, name in canned_roles.items():
-+        for role, name in list(canned_roles.items()):
-             roles.setdefault(role, name)
-
-         # apply ABC auto-decoration to methods that need it
--        for method, decorator in decorators.items():
-+        for method, decorator in list(decorators.items()):
-             fn = getattr(cls, method, None)
-             if (fn and method not in methods and
-                 not hasattr(fn, '_sa_instrumented')):
-@@ -952,12 +954,12 @@
-
-     # apply ad-hoc instrumentation from decorators, class-level defaults
-     # and implicit role declarations
--    for method_name, (before, argument, after) in methods.items():
-+    for method_name, (before, argument, after) in list(methods.items()):
-         setattr(cls, method_name,
-                 _instrument_membership_mutator(getattr(cls, method_name),
-                                                before, argument, after))
-     # intern the role map
--    for role, method_name in roles.items():
-+    for role, method_name in list(roles.items()):
-         setattr(cls, '_sa_%s' % role, getattr(cls, method_name))
-
-     setattr(cls, '_sa_instrumented', id(cls))
-@@ -1094,14 +1096,14 @@
-                     stop += len(self)
-
-                 if step == 1:
--                    for i in xrange(start, stop, step):
-+                    for i in range(start, stop, step):
-                         if len(self) > start:
-                             del self[start]
-
-                     for i, item in enumerate(value):
-                         self.insert(i + start, item)
-                 else:
--                    rng = range(start, stop, step)
-+                    rng = list(range(start, stop, step))
-                     if len(value) != len(rng):
-                         raise ValueError(
-                             "attempt to assign sequence of size %s to "
-@@ -1128,24 +1130,24 @@
-         _tidy(__delitem__)
-         return __delitem__
-
--    # Py2K
--    def __setslice__(fn):
--        def __setslice__(self, start, end, values):
--            for value in self[start:end]:
--                __del(self, value)
--            values = [__set(self, value) for value in values]
--            fn(self, start, end, values)
--        _tidy(__setslice__)
--        return __setslice__
--
--    def __delslice__(fn):
--        def __delslice__(self, start, end):
--            for value in self[start:end]:
--                __del(self, value)
--            fn(self, start, end)
--        _tidy(__delslice__)
--        return __delslice__
--    # end Py2K
-+# start Py2K
-+#    def __setslice__(fn):
-+#        def __setslice__(self, start, end, values):
-+#            for value in self[start:end]:
-+#                __del(self, value)
-+#            values = [__set(self, value) for value in values]
-+#            fn(self, start, end, values)
-+#        _tidy(__setslice__)
-+#        return __setslice__
-+#
-+#    def __delslice__(fn):
-+#        def __delslice__(self, start, end):
-+#            for value in self[start:end]:
-+#                __del(self, value)
-+#            fn(self, start, end)
-+#        _tidy(__delslice__)
-+#        return __delslice__
-+# end Py2K
-
-     def extend(fn):
-         def extend(self, iterable):
-@@ -1251,7 +1253,7 @@
-         def update(self, __other=Unspecified, **kw):
-             if __other is not Unspecified:
-                 if hasattr(__other, 'keys'):
--                    for key in __other.keys():
-+                    for key in list(__other.keys()):
-                         if (key not in self or
-                             self[key] is not __other[key]):
-                             self[key] = __other[key]
-@@ -1467,11 +1469,12 @@
-         ),
-
-     # decorators are required for dicts and object collections.
--    # Py3K
--    #dict: ({'iterator': 'values'}, _dict_decorators()),
--    # Py2K
--    dict: ({'iterator': 'itervalues'}, _dict_decorators()),
--    # end Py2K
-+# start Py3K
-+    dict: ({'iterator': 'values'}, _dict_decorators()),
-+# end Py3K
-+# start Py2K
-+#    dict: ({'iterator': 'itervalues'}, _dict_decorators()),
-+# end Py2K
-     }
-
-
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/descriptor_props.py
---- a/lib/sqlalchemy/orm/descriptor_props.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/descriptor_props.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -184,7 +184,7 @@
-     def _init_props(self):
-         self.props = props = []
-         for attr in self.attrs:
--            if isinstance(attr, basestring):
-+            if isinstance(attr, str):
-                 prop = self.parent.get_property(attr)
-             elif isinstance(attr, schema.Column):
-                 prop = self.parent._columntoproperty[attr]
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/evaluator.py
---- a/lib/sqlalchemy/orm/evaluator.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/evaluator.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -13,9 +13,9 @@
-
- _straight_ops = set(getattr(operators, op)
-                     for op in ('add', 'mul', 'sub',
--                                # Py2K
--                                'div',
--                                # end Py2K
-+# start Py2K
-+#                                'div',
-+# end Py2K
-                                 'mod', 'truediv',
-                                'lt', 'le', 'ne', 'gt', 'ge', 'eq'))
-
-@@ -50,7 +50,7 @@
-         return lambda obj: get_corresponding_attr(obj)
-
-     def visit_clauselist(self, clause):
--        evaluators = map(self.process, clause.clauses)
-+        evaluators = list(map(self.process, clause.clauses))
-         if clause.operator is operators.or_:
-             def evaluate(obj):
-                 has_null = False
-@@ -79,8 +79,8 @@
-         return evaluate
-
-     def visit_binary(self, clause):
--        eval_left, eval_right = map(self.process,
--                                [clause.left, clause.right])
-+        eval_left, eval_right = list(map(self.process,
-+                                [clause.left, clause.right]))
-         operator = clause.operator
-         if operator is operators.is_:
-             def evaluate(obj):
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/identity.py
---- a/lib/sqlalchemy/orm/identity.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/identity.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -75,7 +75,7 @@
-         state = dict.__getitem__(self, key)
-         o = state.obj()
-         if o is None:
--            raise KeyError, key
-+            raise KeyError(key)
-         return o
-
-     def __contains__(self, key):
-@@ -152,30 +152,32 @@
-
-         return result
-
--    # Py3K
--    #def items(self):
--    #    return iter(self._items())
--    #
--    #def values(self):
--    #    return iter(self._values())
--    # Py2K
--    items = _items
--
--    def iteritems(self):
--        return iter(self.items())
--
--    values = _values
--
--    def itervalues(self):
--        return iter(self.values())
--    # end Py2K
-+# start Py3K
-+    def items(self):
-+        return iter(self._items())
-+
-+    def values(self):
-+        return iter(self._values())
-+# end Py3K
-+# start Py2K
-+#    items = _items
-+#
-+#    def iteritems(self):
-+#        return iter(self.items())
-+#
-+#    values = _values
-+#
-+#    def itervalues(self):
-+#        return iter(self.values())
-+# end Py2K
-
-     def all_states(self):
--        # Py3K
--        # return list(dict.values(self))
--        # Py2K
--        return dict.values(self)
--        # end Py2K
-+# start Py3K
-+         return list(dict.values(self))
-+# end Py3K
-+# start Py2K
-+#        return dict.values(self)
-+# end Py2K
-
-     def discard(self, state):
-         st = dict.get(self, state.key, None)
-@@ -189,7 +191,7 @@
-
- class StrongInstanceDict(IdentityMap):
-     def all_states(self):
--        return [attributes.instance_state(o) for o in self.itervalues()]
-+        return [attributes.instance_state(o) for o in self.values()]
-
-     def contains_state(self, state):
-         return (
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/instrumentation.py
---- a/lib/sqlalchemy/orm/instrumentation.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/instrumentation.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -279,7 +279,7 @@
-
-     @property
-     def attributes(self):
--        return self.itervalues()
-+        return iter(self.values())
-
-     ## InstanceState management
-
-@@ -325,7 +325,7 @@
-         """TODO"""
-         return self.get_impl(key).hasparent(state, optimistic=optimistic)
-
--    def __nonzero__(self):
-+    def __bool__(self):
-         """All ClassManagers are non-zero regardless of attribute state."""
-         return True
-
-@@ -444,21 +444,23 @@
-     func_vars = util.format_argspec_init(original__init__, grouped=False)
-     func_text = func_body % func_vars
-
--    # Py3K
--    #func_defaults = getattr(original__init__, '__defaults__', None)
--    #func_kw_defaults = getattr(original__init__, '__kwdefaults__', None)
--    # Py2K
--    func = getattr(original__init__, 'im_func', original__init__)
--    func_defaults = getattr(func, 'func_defaults', None)
--    # end Py2K
-+# start Py3K
-+    func_defaults = getattr(original__init__, '__defaults__', None)
-+    func_kw_defaults = getattr(original__init__, '__kwdefaults__', None)
-+# end Py3K
-+# start Py2K
-+#    func = getattr(original__init__, 'im_func', original__init__)
-+#    func_defaults = getattr(func, 'func_defaults', None)
-+# end Py2K
-
-     env = locals().copy()
--    exec func_text in env
-+    exec(func_text, env)
-     __init__ = env['__init__']
-     __init__.__doc__ = original__init__.__doc__
-     if func_defaults:
--        __init__.func_defaults = func_defaults
--    # Py3K
--    #if func_kw_defaults:
--    #    __init__.__kwdefaults__ = func_kw_defaults
-+        __init__.__defaults__ = func_defaults
-+# start Py3K
-+    if func_kw_defaults:
-+        __init__.__kwdefaults__ = func_kw_defaults
-+# end Py3K
-     return __init__
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/interfaces.py
---- a/lib/sqlalchemy/orm/interfaces.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/interfaces.py Sat Apr 27 19:42:17 2013 -0400
-@@ -15,7 +15,7 @@
- classes within should be considered mostly private.
-
- """
--from __future__ import absolute_import
-+
-
- from .. import exc as sa_exc, util, inspect
- from ..sql import operators
-@@ -659,7 +659,7 @@
-         tokens = deque(self.key)
-         while tokens:
-             token = tokens.popleft()
--            if isinstance(token, basestring):
-+            if isinstance(token, str):
-                 # wildcard token
-                 if token.endswith(':*'):
-                     return [path.token(token)]
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/loading.py
---- a/lib/sqlalchemy/orm/loading.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/loading.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -11,7 +11,7 @@
- as well as some of the attribute loading strategies.
-
- """
--from __future__ import absolute_import
-+
-
- from .. import util
- from . import attributes, exc as orm_exc, state as statelib
-@@ -47,11 +47,11 @@
-                     query._entities[0].mapper.dispatch.append_result
-
-     (process, labels) = \
--                zip(*[
-+                list(zip(*[
-                     query_entity.row_processor(query,
-                             context, custom_rows)
-                     for query_entity in query._entities
--                ])
-+                ]))
-
-     while True:
-         context.progress = {}
-@@ -84,11 +84,11 @@
-             context.progress.pop(context.refresh_state)
-
-         statelib.InstanceState._commit_all_states(
--            context.progress.items(),
-+            list(context.progress.items()),
-             session.identity_map
-         )
-
--        for state, (dict_, attrs) in context.partials.iteritems():
-+        for state, (dict_, attrs) in context.partials.items():
-             state._commit(dict_, attrs)
-
-         for row in rows:
-@@ -507,7 +507,7 @@
-     pops = (new_populators, existing_populators, delayed_populators,
-                         eager_populators)
-
--    for prop in mapper._props.itervalues():
-+    for prop in mapper._props.values():
-
-         for i, pop in enumerate(prop.create_row_processor(
-                                     context,
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/mapper.py
---- a/lib/sqlalchemy/orm/mapper.py     Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/mapper.py     Sat Apr 27 19:42:17 2013 -0400
-@@ -13,7 +13,7 @@
- available in :class:`~sqlalchemy.orm.`.
-
- """
--from __future__ import absolute_import
-+
- import types
- import weakref
- from itertools import chain
-@@ -581,7 +581,7 @@
-         if with_polymorphic == '*':
-             self.with_polymorphic = ('*', None)
-         elif isinstance(with_polymorphic, (tuple, list)):
--            if isinstance(with_polymorphic[0], (basestring, tuple, list)):
-+            if isinstance(with_polymorphic[0], (str, tuple, list)):
-                 self.with_polymorphic = with_polymorphic
-             else:
-                 self.with_polymorphic = (with_polymorphic, None)
-@@ -626,7 +626,7 @@
-         self.inherits._inheriting_mappers.add(self)
-         self.passive_updates = self.inherits.passive_updates
-         self._all_tables = self.inherits._all_tables
--        for key, prop in mapper._props.iteritems():
-+        for key, prop in mapper._props.items():
-             if key not in self._props and \
-                 not self._should_exclude(key, key, local=False,
-                                         column=None):
-@@ -866,12 +866,12 @@
-
-         # load custom properties
-         if self._init_properties:
--            for key, prop in self._init_properties.iteritems():
-+            for key, prop in self._init_properties.items():
-                 self._configure_property(key, prop, False)
-
-         # pull properties from the inherited mapper if any.
-         if self.inherits:
--            for key, prop in self.inherits._props.iteritems():
-+            for key, prop in self.inherits._props.items():
-                 if key not in self._props and \
-                     not self._should_exclude(key, key, local=False,
-                                             column=None):
-@@ -919,7 +919,7 @@
-         if self.polymorphic_on is not None:
-             setter = True
-
--            if isinstance(self.polymorphic_on, basestring):
-+            if isinstance(self.polymorphic_on, str):
-                 # polymorphic_on specified as as string - link
-                 # it to mapped ColumnProperty
-                 try:
-@@ -1235,7 +1235,7 @@
-         """
-
-         self._log("_post_configure_properties() started")
--        l = [(key, prop) for key, prop in self._props.iteritems()]
-+        l = [(key, prop) for key, prop in self._props.items()]
-         for key, prop in l:
-             self._log("initialize prop %s", key)
-
-@@ -1253,7 +1253,7 @@
-         using `add_property`.
-
-         """
--        for key, value in dict_of_properties.iteritems():
-+        for key, value in dict_of_properties.items():
-             self.add_property(key, value)
-
-     def add_property(self, key, prop):
-@@ -1350,7 +1350,7 @@
-         """return an iterator of all MapperProperty objects."""
-         if _new_mappers:
-             configure_mappers()
--        return self._props.itervalues()
-+        return iter(self._props.values())
-
-     def _mappers_from_spec(self, spec, selectable):
-         """given a with_polymorphic() argument, return the set of mappers it
-@@ -1623,7 +1623,7 @@
-         if _new_mappers:
-             configure_mappers()
-         return util.ImmutableProperties(util.OrderedDict(
--            (k, v) for k, v in self._props.iteritems()
-+            (k, v) for k, v in self._props.items()
-             if isinstance(v, type_)
-         ))
-
-@@ -1972,7 +1972,7 @@
-         visited_states = set()
-         prp, mpp = object(), object()
-
--        visitables = deque([(deque(self._props.values()), prp,
-+        visitables = deque([(deque(list(self._props.values())), prp,
-                                 state, state.dict)])
-
-         while visitables:
-@@ -1994,7 +1994,7 @@
-                                 corresponding_dict = iterator.popleft()
-                 yield instance, instance_mapper, \
-                         corresponding_state, corresponding_dict
--                visitables.append((deque(instance_mapper._props.values()),
-+                visitables.append((deque(list(instance_mapper._props.values())),
-                                         prp, corresponding_state,
-                                         corresponding_dict))
-
-@@ -2011,7 +2011,7 @@
-                 table_to_mapper.setdefault(t, mapper)
-
-         extra_dependencies = []
--        for table, mapper in table_to_mapper.items():
-+        for table, mapper in list(table_to_mapper.items()):
-             super_ = mapper.inherits
-             if super_:
-                 extra_dependencies.extend([
-@@ -2040,7 +2040,7 @@
-                     return fk.parent not in cols
-             return False
-
--        sorted_ = sql_util.sort_tables(table_to_mapper.iterkeys(),
-+        sorted_ = sql_util.sort_tables(iter(table_to_mapper.keys()),
-                                     skip_fn=skip,
-                                     extra_dependencies=extra_dependencies)
-
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/persistence.py
---- a/lib/sqlalchemy/orm/persistence.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/persistence.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -45,7 +45,7 @@
-
-     cached_connections = _cached_connection_dict(base_mapper)
-
--    for table, mapper in base_mapper._sorted_tables.iteritems():
-+    for table, mapper in base_mapper._sorted_tables.items():
-         insert = _collect_insert_commands(base_mapper, uowtransaction,
-                                 table, states_to_insert)
-
-@@ -77,7 +77,7 @@
-                                     base_mapper,
-                                     states, uowtransaction)
-
--    for table, mapper in base_mapper._sorted_tables.iteritems():
-+    for table, mapper in base_mapper._sorted_tables.items():
-         update = _collect_post_update_commands(base_mapper, uowtransaction,
-                                             table, states_to_update,
-                                             post_update_cols)
-@@ -105,7 +105,7 @@
-
-     table_to_mapper = base_mapper._sorted_tables
-
--    for table in reversed(table_to_mapper.keys()):
-+    for table in reversed(list(table_to_mapper.keys())):
-         delete = _collect_delete_commands(base_mapper, uowtransaction,
-                                 table, states_to_delete)
-
-@@ -318,7 +318,7 @@
-                     # history is only
-                     # in a different table than the one
-                     # where the version_id_col is.
--                    for prop in mapper._columntoproperty.itervalues():
-+                    for prop in mapper._columntoproperty.values():
-                         history = attributes.get_state_history(
-                                 state, prop.key,
-                                 attributes.PASSIVE_NO_INITIALIZE)
-@@ -526,7 +526,7 @@
-     for (connection, pkeys, hasvalue, has_all_pks), \
-         records in groupby(insert,
-                             lambda rec: (rec[4],
--                                    rec[2].keys(),
-+                                    list(rec[2].keys()),
-                                     bool(rec[5]),
-                                     rec[6])
-     ):
-@@ -612,7 +612,7 @@
-     # also group them into common (connection, cols) sets
-     # to support executemany().
-     for key, grouper in groupby(
--        update, lambda rec: (rec[4], rec[2].keys())
-+        update, lambda rec: (rec[4], list(rec[2].keys()))
-     ):
-         connection = key[0]
-         multiparams = [params for state, state_dict,
-@@ -646,7 +646,7 @@
-
-         return table.delete(clause)
-
--    for connection, del_objects in delete.iteritems():
-+    for connection, del_objects in delete.items():
-         statement = base_mapper._memo(('delete', table), delete_stmt)
-
-         connection = cached_connections[connection]
-@@ -803,7 +803,7 @@
-             raise sa_exc.ArgumentError(
-                             "Valid strategies for session synchronization "
-                             "are %s" % (", ".join(sorted(repr(x)
--                                for x in lookup.keys()))))
-+                                for x in list(lookup.keys())))))
-         else:
-             return klass(*arg)
-
-@@ -868,7 +868,7 @@
-         #TODO: detect when the where clause is a trivial primary key match
-         self.matched_objects = [
-                             obj for (cls, pk), obj in
--                            query.session.identity_map.iteritems()
-+                            query.session.identity_map.items()
-                             if issubclass(cls, target_cls) and
-                             eval_condition(obj)]
-
-@@ -951,7 +951,7 @@
-
-     def _additional_evaluators(self, evaluator_compiler):
-         self.value_evaluators = {}
--        for key, value in self.values.iteritems():
-+        for key, value in self.values.items():
-             key = _attr_as_key(key)
-             self.value_evaluators[key] = evaluator_compiler.process(
-                                 expression._literal_as_binds(value))
-@@ -959,7 +959,7 @@
-     def _do_post_synchronize(self):
-         session = self.query.session
-         states = set()
--        evaluated_keys = self.value_evaluators.keys()
-+        evaluated_keys = list(self.value_evaluators.keys())
-         for obj in self.matched_objects:
-             state, dict_ = attributes.instance_state(obj),\
-                                     attributes.instance_dict(obj)
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/properties.py
---- a/lib/sqlalchemy/orm/properties.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/properties.py Sat Apr 27 19:42:17 2013 -0400
-@@ -27,7 +27,7 @@
- mapperlib = util.importlater("sqlalchemy.orm", "mapperlib")
- NoneType = type(None)
-
--from descriptor_props import CompositeProperty, SynonymProperty, \
-+from .descriptor_props import CompositeProperty, SynonymProperty, \
-             ComparableProperty, ConcreteInheritedProperty
-
- __all__ = ['ColumnProperty', 'CompositeProperty', 'SynonymProperty',
-@@ -1204,7 +1204,7 @@
-         if not self.is_primary():
-             return
-         if self.backref is not None and not self.back_populates:
--            if isinstance(self.backref, basestring):
-+            if isinstance(self.backref, str):
-                 backref_key, kwargs = self.backref, {}
-             else:
-                 backref_key, kwargs = self.backref
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/query.py
---- a/lib/sqlalchemy/orm/query.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/query.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -47,7 +47,7 @@
-     def generate(fn, *args, **kw):
-         self = args[0]._clone()
-         for assertion in assertions:
--            assertion(self, fn.func_name)
-+            assertion(self, fn.__name__)
-         fn(self, *args[1:], **kw)
-         return self
-     return generate
-@@ -981,11 +981,12 @@
-         """Return a scalar result corresponding to the given
-         column expression."""
-         try:
--            # Py3K
--            #return self.values(column).__next__()[0]
--            # Py2K
--            return self.values(column).next()[0]
--            # end Py2K
-+# start Py3K
-+            return self.values(column).__next__()[0]
-+# end Py3K
-+# start Py2K
-+#            return self.values(column).next()[0]
-+# end Py2K
-         except StopIteration:
-             return None
-
-@@ -1231,7 +1232,7 @@
-         """
-
-         clauses = [_entity_descriptor(self._joinpoint_zero(), key) == value
--            for key, value in kwargs.iteritems()]
-+            for key, value in kwargs.items()]
-         return self.filter(sql.and_(*clauses))
-
-     @_generative(_no_statement_condition, _no_limit_offset)
-@@ -1296,7 +1297,7 @@
-
-         """
-
--        if isinstance(criterion, basestring):
-+        if isinstance(criterion, str):
-             criterion = sql.text(criterion)
-
-         if criterion is not None and \
-@@ -1655,7 +1656,7 @@
-                                     kwargs.pop('from_joinpoint', False)
-         if kwargs:
-             raise TypeError("unknown arguments: %s" %
--                                ','.join(kwargs.iterkeys()))
-+                                ','.join(iter(kwargs.keys())))
-         return self._join(props,
-                             outerjoin=False, create_aliases=aliased,
-                             from_joinpoint=from_joinpoint)
-@@ -1671,7 +1672,7 @@
-                                 kwargs.pop('from_joinpoint', False)
-         if kwargs:
-             raise TypeError("unknown arguments: %s" %
--                    ','.join(kwargs.iterkeys()))
-+                    ','.join(iter(kwargs.keys())))
-         return self._join(props,
-                             outerjoin=True, create_aliases=aliased,
-                             from_joinpoint=from_joinpoint)
-@@ -1701,7 +1702,7 @@
-         if len(keys) == 2 and \
-             isinstance(keys[0], (expression.FromClause,
-                                     type, AliasedClass)) and \
--            isinstance(keys[1], (basestring, expression.ClauseElement,
-+            isinstance(keys[1], (str, expression.ClauseElement,
-                                         interfaces.PropComparator)):
-             # detect 2-arg form of join and
-             # convert to a tuple.
-@@ -1721,14 +1722,14 @@
-             # is a little bit of legacy behavior still at work here
-             # which means they might be in either order.  may possibly
-             # lock this down to (right_entity, onclause) in 0.6.
--            if isinstance(arg1, (interfaces.PropComparator, basestring)):
-+            if isinstance(arg1, (interfaces.PropComparator, str)):
-                 right_entity, onclause = arg2, arg1
-             else:
-                 right_entity, onclause = arg1, arg2
-
-             left_entity = prop = None
-
--            if isinstance(onclause, basestring):
-+            if isinstance(onclause, str):
-                 left_entity = self._joinpoint_zero()
-
-                 descriptor = _entity_descriptor(left_entity, onclause)
-@@ -1922,7 +1923,7 @@
-                     clause = orm_join(clause,
-                                     right,
-                                     onclause, isouter=outerjoin)
--                except sa_exc.ArgumentError, ae:
-+                except sa_exc.ArgumentError as ae:
-                     raise sa_exc.InvalidRequestError(
-                             "Could not find a FROM clause to join from.  "
-                             "Tried joining to %s, but got: %s" % (right, ae))
-@@ -1947,7 +1948,7 @@
-
-         try:
-             clause = orm_join(clause, right, onclause, isouter=outerjoin)
--        except sa_exc.ArgumentError, ae:
-+        except sa_exc.ArgumentError as ae:
-             raise sa_exc.InvalidRequestError(
-                     "Could not find a FROM clause to join from.  "
-                     "Tried joining to %s, but got: %s" % (right, ae))
-@@ -2115,7 +2116,7 @@
-         appropriate to the entity class represented by this ``Query``.
-
-         """
--        if isinstance(statement, basestring):
-+        if isinstance(statement, str):
-             statement = sql.text(statement)
-
-         if not isinstance(statement,
-@@ -2609,7 +2610,7 @@
-                             use_labels=context.labels)
-
-         from_clause = inner
--        for eager_join in context.eager_joins.values():
-+        for eager_join in list(context.eager_joins.values()):
-             # EagerLoader places a 'stop_on' attribute on the join,
-             # giving us a marker as to where the "splice point" of
-             # the join should be
-@@ -2674,7 +2675,7 @@
-         subtypes are selected from the total results.
-
-         """
--        for (ext_info, adapter) in self._mapper_adapter_map.values():
-+        for (ext_info, adapter) in list(self._mapper_adapter_map.values()):
-             if ext_info in self._join_entities:
-                 continue
-             single_crit = ext_info.mapper._single_table_criterion
-@@ -2697,7 +2698,7 @@
-     def __new__(cls, *args, **kwargs):
-         if cls is _QueryEntity:
-             entity = args[1]
--            if not isinstance(entity, basestring) and \
-+            if not isinstance(entity, str) and \
-                         _is_mapped_class(entity):
-                 cls = _MapperEntity
-             else:
-@@ -2905,7 +2906,7 @@
-         self.expr = column
-         self.namespace = namespace
-
--        if isinstance(column, basestring):
-+        if isinstance(column, str):
-             column = sql.literal_column(column)
-             self._label_name = column.name
-         elif isinstance(column, (
-@@ -3080,7 +3081,7 @@
-         self.alias = alias
-
-     def process_query(self, query):
--        if isinstance(self.alias, basestring):
-+        if isinstance(self.alias, str):
-             alias = query._mapper_zero().mapped_table.alias(self.alias)
-         else:
-             alias = self.alias
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/session.py
---- a/lib/sqlalchemy/orm/session.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/session.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -5,7 +5,7 @@
- # the MIT License: http://www.opensource.org/licenses/mit-license.php
- """Provides the Session class and related utilities."""
-
--from __future__ import with_statement
-+
-
- import weakref
- from .. import util, sql, engine, exc as sa_exc, event
-@@ -35,7 +35,7 @@
-     def close_all(cls):
-         """Close *all* sessions in memory."""
-
--        for sess in _sessions.values():
-+        for sess in list(_sessions.values()):
-             sess.close()
-
-     @classmethod
-@@ -249,7 +249,7 @@
-             if s.key:
-                 del s.key
-
--        for s, (oldkey, newkey) in self._key_switches.items():
-+        for s, (oldkey, newkey) in list(self._key_switches.items()):
-             self.session.identity_map.discard(s)
-             s.key = oldkey
-             self.session.identity_map.replace(s)
-@@ -327,7 +327,7 @@
-                 subtransaction.commit()
-
-         if not self.session._flushing:
--            for _flush_guard in xrange(100):
-+            for _flush_guard in range(100):
-                 if self.session._is_clean():
-                     break
-                 self.session.flush()
-@@ -604,7 +604,7 @@
-                 SessionExtension._adapt_listener(self, ext)
-
-         if binds is not None:
--            for mapperortable, bind in binds.iteritems():
-+            for mapperortable, bind in binds.items():
-                 if isinstance(mapperortable, (type, Mapper)):
-                     self.bind_mapper(mapperortable, bind)
-                 else:
-@@ -1775,7 +1775,7 @@
-         Session.
-
-         """
--        return iter(list(self._new.values()) + self.identity_map.values())
-+        return iter(list(self._new.values()) + list(self.identity_map.values()))
-
-     def _contains_state(self, state):
-         return state in self._new or self.identity_map.contains_state(state)
-@@ -2138,13 +2138,13 @@
-     def deleted(self):
-         "The set of all instances marked as 'deleted' within this ``Session``"
-
--        return util.IdentitySet(self._deleted.values())
-+        return util.IdentitySet(list(self._deleted.values()))
-
-     @property
-     def new(self):
-         "The set of all instances marked as 'new' within this ``Session``."
-
--        return util.IdentitySet(self._new.values())
-+        return util.IdentitySet(list(self._new.values()))
-
-
- class sessionmaker(_SessionClassMethods):
-@@ -2236,7 +2236,7 @@
-             session = Session()  # invokes sessionmaker.__call__()
-
-         """
--        for k, v in self.kw.items():
-+        for k, v in list(self.kw.items()):
-             local_kw.setdefault(k, v)
-         return self.class_(**local_kw)
-
-@@ -2255,7 +2255,7 @@
-         return "%s(class_=%r%s)" % (
-                     self.__class__.__name__,
-                     self.class_.__name__,
--                    ", ".join("%s=%r" % (k, v) for k, v in self.kw.items())
-+                    ", ".join("%s=%r" % (k, v) for k, v in list(self.kw.items()))
-                 )
-
- _sessions = weakref.WeakValueDictionary()
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/state.py
---- a/lib/sqlalchemy/orm/state.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/state.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -417,7 +417,7 @@
-            against this set when a refresh operation occurs.
-
-         """
--        return set([k for k, v in self.callables.items() if v is self])
-+        return set([k for k, v in list(self.callables.items()) if v is self])
-
-     def _instance_dict(self):
-         return None
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/strategies.py
---- a/lib/sqlalchemy/orm/strategies.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/strategies.py Sat Apr 27 19:42:17 2013 -0400
-@@ -359,7 +359,7 @@
-                         )
-
-         if self.use_get:
--            for col in self._equated_columns.keys():
-+            for col in list(self._equated_columns.keys()):
-                 if col in self.mapper._equivalent_columns:
-                     for c in self.mapper._equivalent_columns[col]:
-                         self._equated_columns[c] = self._equated_columns[col]
-@@ -1332,7 +1332,7 @@
-     def __init__(self, key, lazy=True, chained=False,
-                     propagate_to_loaders=True
-                     ):
--        if isinstance(key[0], basestring) and key[0] == '*':
-+        if isinstance(key[0], str) and key[0] == '*':
-             if len(key) != 1:
-                 raise sa_exc.ArgumentError(
-                         "Wildcard identifier '*' must "
-@@ -1384,7 +1384,7 @@
-     def __init__(self, key, alias=None, chained=False):
-         super(LoadEagerFromAliasOption, self).__init__(key)
-         if alias is not None:
--            if not isinstance(alias, basestring):
-+            if not isinstance(alias, str):
-                 info = inspect(alias)
-                 alias = info.selectable
-         self.alias = alias
-@@ -1401,7 +1401,7 @@
-
-         root_mapper, prop = paths[-1].path[-2:]
-         if self.alias is not None:
--            if isinstance(self.alias, basestring):
-+            if isinstance(self.alias, str):
-                 self.alias = prop.target.alias(self.alias)
-             paths[-1].set(query, "user_defined_eager_row_processor",
-                 sql_util.ColumnAdapter(self.alias,
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/unitofwork.py
---- a/lib/sqlalchemy/orm/unitofwork.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/unitofwork.py Sat Apr 27 19:42:17 2013 -0400
-@@ -315,7 +315,7 @@
-         # see if the graph of mapper dependencies has cycles.
-         self.cycles = cycles = topological.find_cycles(
-                                         self.dependencies,
--                                        self.postsort_actions.values())
-+                                        list(self.postsort_actions.values()))
-
-         if cycles:
-             # if yes, break the per-mapper actions into
-@@ -342,7 +342,7 @@
-                     for dep in convert[edge[1]]:
-                         self.dependencies.add((edge[0], dep))
-
--        return set([a for a in self.postsort_actions.values()
-+        return set([a for a in list(self.postsort_actions.values())
-                     if not a.disabled
-                     ]
-                 ).difference(cycles)
-@@ -381,7 +381,7 @@
-         """
-         states = set(self.states)
-         isdel = set(
--            s for (s, (isdelete, listonly)) in self.states.iteritems()
-+            s for (s, (isdelete, listonly)) in self.states.items()
-             if isdelete
-         )
-         other = states.difference(isdel)
-@@ -461,7 +461,7 @@
-     def __repr__(self):
-         return "%s(%s)" % (
-             self.__class__.__name__,
--            ",".join(str(x) for x in self.__dict__.values())
-+            ",".join(str(x) for x in list(self.__dict__.values()))
-         )
-
-
-diff -r 9d0639b9d3be lib/sqlalchemy/orm/util.py
---- a/lib/sqlalchemy/orm/util.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/orm/util.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -120,7 +120,7 @@
-     colnames = util.OrderedSet()
-     colnamemaps = {}
-     types = {}
--    for key in table_map.keys():
-+    for key in list(table_map.keys()):
-         table = table_map[key]
-
-         # mysql doesnt like selecting from a select;
-@@ -146,7 +146,7 @@
-                 return sql.type_coerce(sql.null(), types[name]).label(name)
-
-     result = []
--    for type, table in table_map.iteritems():
-+    for type, table in table_map.items():
-         if typecolname is not None:
-             result.append(
-                     sql.select([col(name, table) for name in colnames] +
-@@ -203,7 +203,7 @@
-                 "positional arguments, got %s" % len(args))
-         if kwargs:
-             raise sa_exc.ArgumentError("unknown keyword arguments: %s"
--                % ", ".join(kwargs.keys()))
-+                % ", ".join(list(kwargs.keys())))
-         mapper = class_mapper(class_)
-         if "ident" in locals():
-             return mapper.identity_key_from_primary_key(util.to_list(ident))
-@@ -211,7 +211,7 @@
-     instance = kwargs.pop("instance")
-     if kwargs:
-         raise sa_exc.ArgumentError("unknown keyword arguments: %s"
--            % ", ".join(kwargs.keys()))
-+            % ", ".join(list(kwargs.keys())))
-     mapper = object_mapper(instance)
-     return mapper.identity_key_from_instance(instance)
-
-@@ -300,7 +300,7 @@
-
-     def pairs(self):
-         path = self.path
--        for i in xrange(0, len(path), 2):
-+        for i in range(0, len(path), 2):
-             yield path[i], path[i + 1]
-
-     def contains_mapper(self, mapper):
-@@ -314,10 +314,10 @@
-
-     def serialize(self):
-         path = self.path
--        return zip(
-+        return list(zip(
-             [m.class_ for m in [path[i] for i in range(0, len(path), 2)]],
-             [path[i].key for i in range(1, len(path), 2)] + [None]
--        )
-+        ))
-
-     @classmethod
-     def deserialize(cls, path):
-@@ -411,7 +411,7 @@
-
-         self.path = parent.path + (entity,)
-
--    def __nonzero__(self):
-+    def __bool__(self):
-         return True
-
-     def __getitem__(self, entity):
-@@ -589,8 +589,8 @@
-             return self.__adapt_prop(attr, key)
-         elif hasattr(attr, 'func_code'):
-             is_method = getattr(self.__target, key, None)
--            if is_method and is_method.im_self is not None:
--                return util.types.MethodType(attr.im_func, self, self)
-+            if is_method and is_method.__self__ is not None:
-+                return util.types.MethodType(attr.__func__, self, self)
-             else:
-                 return None
-         elif hasattr(attr, '__get__'):
-@@ -880,7 +880,7 @@
-
-         self._joined_from_info = right_info
-
--        if isinstance(onclause, basestring):
-+        if isinstance(onclause, str):
-             onclause = getattr(left_orm_info.entity, onclause)
-
-         if isinstance(onclause, attributes.QueryableAttribute):
-@@ -1001,7 +1001,7 @@
-       parent/child relationship.
-
-     """
--    if isinstance(prop, basestring):
-+    if isinstance(prop, str):
-         mapper = object_mapper(instance)
-         prop = getattr(mapper.class_, prop).property
-     elif isinstance(prop, attributes.QueryableAttribute):
-diff -r 9d0639b9d3be lib/sqlalchemy/pool.py
---- a/lib/sqlalchemy/pool.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/pool.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -57,7 +57,7 @@
-     All pools and connections are disposed.
-     """
-
--    for manager in proxies.itervalues():
-+    for manager in proxies.values():
-         manager.close()
-     proxies.clear()
-
-@@ -368,7 +368,7 @@
-             connection = self.__pool._creator()
-             self.__pool.logger.debug("Created new connection %r", connection)
-             return connection
--        except Exception, e:
-+        except Exception as e:
-             self.__pool.logger.debug("Error on connect(): %s", e)
-             raise
-
-@@ -391,7 +391,7 @@
-             # Immediately close detached instances
-             if connection_record is None:
-                 pool._close_connection(connection)
--        except Exception, e:
-+        except Exception as e:
-             if connection_record is not None:
-                 connection_record.invalidate(e=e)
-             if isinstance(e, (SystemExit, KeyboardInterrupt)):
-@@ -499,7 +499,7 @@
-                                             self._connection_record,
-                                             self)
-                 return self
--            except exc.DisconnectionError, e:
-+            except exc.DisconnectionError as e:
-                 self._pool.logger.info(
-                 "Disconnection detected on checkout: %s", e)
-                 self._connection_record.invalidate(e)
-@@ -755,7 +755,7 @@
-             wait = self._max_overflow > -1 and \
-                         self._overflow >= self._max_overflow
-             return self._pool.get(wait, self._timeout)
--        except sqla_queue.SAAbort, aborted:
-+        except sqla_queue.SAAbort as aborted:
-             return aborted.context._do_get()
-         except sqla_queue.Empty:
-             if self._max_overflow > -1 and \
-@@ -1004,7 +1004,7 @@
-         self._create_pool_mutex = threading.Lock()
-
-     def close(self):
--        for key in self.pools.keys():
-+        for key in list(self.pools.keys()):
-             del self.pools[key]
-
-     def __del__(self):
-diff -r 9d0639b9d3be lib/sqlalchemy/processors.py
---- a/lib/sqlalchemy/processors.py     Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/processors.py     Sat Apr 27 19:42:17 2013 -0400
-@@ -38,10 +38,10 @@
-                                 "'%s'" % (type_.__name__, value))
-             if has_named_groups:
-                 groups = m.groupdict(0)
--                return type_(**dict(zip(groups.iterkeys(),
--                                        map(int, groups.itervalues()))))
-+                return type_(**dict(list(zip(iter(groups.keys()),
-+                                        list(map(int, iter(groups.values())))))))
-             else:
--                return type_(*map(int, m.groups(0)))
-+                return type_(*list(map(int, m.groups(0))))
-     return process
-
-
-diff -r 9d0639b9d3be lib/sqlalchemy/schema.py
---- a/lib/sqlalchemy/schema.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/schema.py Sat Apr 27 19:42:17 2013 -0400
-@@ -27,7 +27,7 @@
- as components in SQL expressions.
-
- """
--from __future__ import with_statement
-+
- import re
- import inspect
- from . import exc, util, dialects, event, events, inspection
-@@ -683,7 +683,7 @@
-                 continue
-             Index(index.name,
-                   unique=index.unique,
--                  *[table.c[col] for col in index.columns.keys()],
-+                  *[table.c[col] for col in list(index.columns.keys())],
-                   **index.kwargs)
-         table.dispatch._update(self.dispatch)
-         return table
-@@ -898,7 +898,7 @@
-         type_ = kwargs.pop('type_', None)
-         args = list(args)
-         if args:
--            if isinstance(args[0], basestring):
-+            if isinstance(args[0], str):
-                 if name is not None:
-                     raise exc.ArgumentError(
-                         "May not pass name positionally and as a keyword.")
-@@ -944,11 +944,12 @@
-                 args.append(self.default)
-             else:
-                 if getattr(self.type, '_warn_on_bytestring', False):
--                    # Py3K
--                    #if isinstance(self.default, bytes):
--                    # Py2K
--                    if isinstance(self.default, str):
--                    # end Py2K
-+# start Py3K
-+                    if isinstance(self.default, bytes):
-+# end Py3K
-+# start Py2K
-+#                    if isinstance(self.default, str):
-+# end Py2K
-                         util.warn("Unicode column received non-unicode "
-                                   "default value.")
-                 args.append(ColumnDefault(self.default))
-@@ -983,7 +984,7 @@
-
-         if kwargs:
-             raise exc.ArgumentError(
--                "Unknown arguments passed to Column: " + repr(kwargs.keys()))
-+                "Unknown arguments passed to Column: " + repr(list(kwargs.keys())))
-
-     def __str__(self):
-         if self.name is None:
-@@ -1069,7 +1070,7 @@
-         self.table = table
-
-         if self.index:
--            if isinstance(self.index, basestring):
-+            if isinstance(self.index, str):
-                 raise exc.ArgumentError(
-                     "The 'index' keyword argument on Column is boolean only. "
-                     "To create indexes with a specific name, create an "
-@@ -1077,7 +1078,7 @@
-             Index(expression._truncated_label('ix_%s' % self._label),
-                                     self, unique=self.unique)
-         elif self.unique:
--            if isinstance(self.unique, basestring):
-+            if isinstance(self.unique, str):
-                 raise exc.ArgumentError(
-                     "The 'unique' keyword argument on Column is boolean "
-                     "only. To create unique constraints or indexes with a "
-@@ -1153,23 +1154,24 @@
-                 nullable=self.nullable,
-                 quote=self.quote,
-                 _proxies=[self], *fk)
--        except TypeError, e:
--            # Py3K
--            #raise TypeError(
--            #    "Could not create a copy of this %r object.  "
--            #    "Ensure the class includes a _constructor() "
--            #    "attribute or method which accepts the "
--            #    "standard Column constructor arguments, or "
--            #    "references the Column class itself." % self.__class__) from e
--            # Py2K
-+        except TypeError as e:
-+# start Py3K
-             raise TypeError(
-                 "Could not create a copy of this %r object.  "
-                 "Ensure the class includes a _constructor() "
-                 "attribute or method which accepts the "
-                 "standard Column constructor arguments, or "
--                "references the Column class itself. "
--                "Original error: %s" % (self.__class__, e))
--            # end Py2K
-+                "references the Column class itself." % self.__class__) from e
-+# end Py3K
-+# start Py2K
-+#            raise TypeError(
-+#                "Could not create a copy of this %r object.  "
-+#                "Ensure the class includes a _constructor() "
-+#                "attribute or method which accepts the "
-+#                "standard Column constructor arguments, or "
-+#                "references the Column class itself. "
-+#                "Original error: %s" % (self.__class__, e))
-+# end Py2K
-
-         c.table = selectable
-         selectable._columns.add(c)
-@@ -1345,7 +1347,7 @@
-         if schema:
-             return schema + "." + self.column.table.name + \
-                                     "." + self.column.key
--        elif isinstance(self._colspec, basestring):
-+        elif isinstance(self._colspec, str):
-             return self._colspec
-         elif hasattr(self._colspec, '__clause_element__'):
-             _column = self._colspec.__clause_element__()
-@@ -1390,7 +1392,7 @@
-         """
-         # ForeignKey inits its remote column as late as possible, so tables
-         # can be defined without dependencies
--        if isinstance(self._colspec, basestring):
-+        if isinstance(self._colspec, str):
-             # locate the parent table this foreign key is attached to.  we
-             # use the "original" column which our parent column represents
-             # (its a list of columns/other ColumnElements if the parent
-@@ -1657,7 +1659,8 @@
-         defaulted = argspec[3] is not None and len(argspec[3]) or 0
-         positionals = len(argspec[0]) - defaulted
-
--        # Py3K compat - no unbound methods
-+# start Py3K
-+# end Py3K
-         if inspect.ismethod(inspectable) or inspect.isclass(fn):
-             positionals -= 1
-
-@@ -1919,7 +1922,7 @@
-     has_argument = True
-
-     def __init__(self, arg, for_update=False, _reflected=False):
--        util.assert_arg_type(arg, (basestring,
-+        util.assert_arg_type(arg, (str,
-                                    expression.ClauseElement,
-                                    expression.TextClause), 'arg')
-         super(DefaultClause, self).__init__(for_update)
-@@ -2029,7 +2032,7 @@
-
-     def _set_parent(self, table):
-         for col in self._pending_colargs:
--            if isinstance(col, basestring):
-+            if isinstance(col, str):
-                 col = table.c[col]
-             self.columns.add(col)
-
-@@ -2066,7 +2069,7 @@
-
-     def copy(self, **kw):
-         c = self.__class__(name=self.name, deferrable=self.deferrable,
--                              initially=self.initially, *self.columns.keys())
-+                              initially=self.initially, *list(self.columns.keys()))
-         c.dispatch._update(self.dispatch)
-         return c
-
-@@ -2256,19 +2259,19 @@
-
-     @property
-     def columns(self):
--        return self._elements.keys()
-+        return list(self._elements.keys())
-
-     @property
-     def elements(self):
--        return self._elements.values()
-+        return list(self._elements.values())
-
-     def _set_parent(self, table):
-         super(ForeignKeyConstraint, self)._set_parent(table)
-
--        for col, fk in self._elements.iteritems():
-+        for col, fk in self._elements.items():
-             # string-specified column names now get
-             # resolved to Column objects
--            if isinstance(col, basestring):
-+            if isinstance(col, str):
-                 try:
-                     col = table.c[col]
-                 except KeyError:
-@@ -2293,8 +2296,8 @@
-
-     def copy(self, schema=None, **kw):
-         fkc = ForeignKeyConstraint(
--                    [x.parent.key for x in self._elements.values()],
--                    [x._get_colspec(schema=schema) for x in self._elements.values()],
-+                    [x.parent.key for x in list(self._elements.values())],
-+                    [x._get_colspec(schema=schema) for x in list(self._elements.values())],
-                     name=self.name,
-                     onupdate=self.onupdate,
-                     ondelete=self.ondelete,
-@@ -2569,7 +2572,7 @@
-         return 'MetaData(bind=%r)' % self.bind
-
-     def __contains__(self, table_or_key):
--        if not isinstance(table_or_key, basestring):
-+        if not isinstance(table_or_key, str):
-             table_or_key = table_or_key.key
-         return table_or_key in self.tables
-
-@@ -2584,7 +2587,7 @@
-         dict.pop(self.tables, key, None)
-         if self._schemas:
-             self._schemas = set([t.schema
--                                for t in self.tables.values()
-+                                for t in list(self.tables.values())
-                                 if t.schema is not None])
-
-     def __getstate__(self):
-@@ -2629,7 +2632,7 @@
-     def _bind_to(self, bind):
-         """Bind this MetaData to an Engine, Connection, string or URL."""
-
--        if isinstance(bind, (basestring, url.URL)):
-+        if isinstance(bind, (str, url.URL)):
-             from sqlalchemy import create_engine
-             self._bind = create_engine(bind)
-         else:
-@@ -2662,7 +2665,7 @@
-             :meth:`.Inspector.sorted_tables`
-
-         """
--        return sqlutil.sort_tables(self.tables.itervalues())
-+        return sqlutil.sort_tables(iter(self.tables.values()))
-
-     def reflect(self, bind=None, schema=None, views=False, only=None):
-         """Load all available table definitions from the database.
-@@ -2723,7 +2726,7 @@
-                     bind.dialect.get_view_names(conn, schema)
-                 )
-
--            current = set(self.tables.iterkeys())
-+            current = set(self.tables.keys())
-
-             if only is None:
-                 load = [name for name in available if name not in current]
-@@ -2845,7 +2848,7 @@
-     def _bind_to(self, bind):
-         """Bind to a Connectable in the caller's thread."""
-
--        if isinstance(bind, (basestring, url.URL)):
-+        if isinstance(bind, (str, url.URL)):
-             try:
-                 self.context._engine = self.__engines[bind]
-             except KeyError:
-@@ -2870,7 +2873,7 @@
-     def dispose(self):
-         """Dispose all bound engines, in all thread contexts."""
-
--        for e in self.__engines.itervalues():
-+        for e in self.__engines.values():
-             if hasattr(e, 'dispose'):
-                 e.dispose()
-
-@@ -3075,7 +3078,7 @@
-             not self._should_execute_deprecated(None, target, bind, **kw):
-             return False
-
--        if isinstance(self.dialect, basestring):
-+        if isinstance(self.dialect, str):
-             if self.dialect != bind.engine.name:
-                 return False
-         elif isinstance(self.dialect, (tuple, list, set)):
-@@ -3090,7 +3093,7 @@
-     def _should_execute_deprecated(self, event, target, bind, **kw):
-         if self.on is None:
-             return True
--        elif isinstance(self.on, basestring):
-+        elif isinstance(self.on, str):
-             return self.on == bind.engine.name
-         elif isinstance(self.on, (tuple, list, set)):
-             return bind.engine.name in self.on
-@@ -3105,7 +3108,7 @@
-
-     def _check_ddl_on(self, on):
-         if (on is not None and
--            (not isinstance(on, (basestring, tuple, list, set)) and
-+            (not isinstance(on, (str, tuple, list, set)) and
-                     not util.callable(on))):
-             raise exc.ArgumentError(
-                 "Expected the name of a database dialect, a tuple "
-@@ -3230,7 +3233,7 @@
-
-         """
-
--        if not isinstance(statement, basestring):
-+        if not isinstance(statement, str):
-             raise exc.ArgumentError(
-                 "Expected a string or unicode SQL statement, got '%r'" %
-                 statement)
-@@ -3262,7 +3265,7 @@
- def _to_schema_column_or_string(element):
-     if hasattr(element, '__clause_element__'):
-         element = element.__clause_element__()
--    if not isinstance(element, (basestring, expression.ColumnElement)):
-+    if not isinstance(element, (str, expression.ColumnElement)):
-         msg = "Element %r is not a string name or column element"
-         raise exc.ArgumentError(msg % element)
-     return element
-diff -r 9d0639b9d3be lib/sqlalchemy/sql/__init__.py
---- a/lib/sqlalchemy/sql/__init__.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/sql/__init__.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -64,5 +64,5 @@
-
- from .visitors import ClauseVisitor
-
--__tmp = locals().keys()
-+__tmp = list(locals().keys())
- __all__ = sorted([i for i in __tmp if not i.startswith('__')])
-diff -r 9d0639b9d3be lib/sqlalchemy/sql/compiler.py
---- a/lib/sqlalchemy/sql/compiler.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/sql/compiler.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -51,7 +51,7 @@
-     'using', 'verbose', 'when', 'where'])
-
- LEGAL_CHARACTERS = re.compile(r'^[A-Z0-9_$]+$', re.I)
--ILLEGAL_INITIAL_CHARACTERS = set([str(x) for x in xrange(0, 10)]).union(['$'])
-+ILLEGAL_INITIAL_CHARACTERS = set([str(x) for x in range(0, 10)]).union(['$'])
-
- BIND_PARAMS = re.compile(r'(?<![:\w\$\x5c]):([\w\$]+)(?![:\w\$])', re.UNICODE)
- BIND_PARAMS_ESC = re.compile(r'\x5c(:[\w\$]+)(?![:\w\$])', re.UNICODE)
-@@ -83,9 +83,9 @@
-     operators.add: ' + ',
-     operators.mul: ' * ',
-     operators.sub: ' - ',
--    # Py2K
--    operators.div: ' / ',
--    # end Py2K
-+# start Py2K
-+#    operators.div: ' / ',
-+# end Py2K
-     operators.mod: ' % ',
-     operators.truediv: ' / ',
-     operators.neg: '-',
-@@ -334,7 +334,7 @@
-
-         if params:
-             pd = {}
--            for bindparam, name in self.bind_names.iteritems():
-+            for bindparam, name in self.bind_names.items():
-                 if bindparam.key in params:
-                     pd[name] = params[bindparam.key]
-                 elif name in params:
-@@ -480,7 +480,7 @@
-
-     def visit_textclause(self, textclause, **kwargs):
-         if textclause.typemap is not None:
--            for colname, type_ in textclause.typemap.iteritems():
-+            for colname, type_ in textclause.typemap.items():
-                 self.result_map[colname
-                                 if self.dialect.case_sensitive
-                                 else colname.lower()] = \
-@@ -826,12 +826,12 @@
-         of the DBAPI.
-
-         """
--        if isinstance(value, basestring):
-+        if isinstance(value, str):
-             value = value.replace("'", "''")
-             return "'%s'" % value
-         elif value is None:
-             return "NULL"
--        elif isinstance(value, (float, int, long)):
-+        elif isinstance(value, (float, int)):
-             return repr(value)
-         elif isinstance(value, decimal.Decimal):
-             return str(value)
-@@ -1136,7 +1136,7 @@
-                                     self, ashint=True)
-                             })
-                             for (from_, dialect), hinttext in
--                            select._hints.iteritems()
-+                            select._hints.items()
-                             if dialect in ('*', self.dialect.name)
-                         ])
-             hint_text = self.get_select_hint_text(byfrom)
-@@ -1214,7 +1214,7 @@
-             self.positiontup = self.cte_positional + self.positiontup
-         cte_text = self.get_cte_preamble(self.ctes_recursive) + " "
-         cte_text += ", \n".join(
--            [txt for txt in self.ctes.values()]
-+            [txt for txt in list(self.ctes.values())]
-         )
-         cte_text += "\n "
-         return cte_text
-@@ -1325,7 +1325,7 @@
-             dialect_hints = dict([
-                 (table, hint_text)
-                 for (table, dialect), hint_text in
--                insert_stmt._hints.items()
-+                list(insert_stmt._hints.items())
-                 if dialect in ('*', self.dialect.name)
-             ])
-             if insert_stmt.table in dialect_hints:
-@@ -1422,7 +1422,7 @@
-             dialect_hints = dict([
-                 (table, hint_text)
-                 for (table, dialect), hint_text in
--                update_stmt._hints.items()
-+                list(update_stmt._hints.items())
-                 if dialect in ('*', self.dialect.name)
-             ])
-             if update_stmt.table in dialect_hints:
-@@ -1528,7 +1528,7 @@
-         values = []
-
-         if stmt_parameters is not None:
--            for k, v in stmt_parameters.iteritems():
-+            for k, v in stmt_parameters.items():
-                 colkey = sql._column_as_key(k)
-                 if colkey is not None:
-                     parameters.setdefault(colkey, v)
-@@ -1559,7 +1559,7 @@
-         if extra_tables and stmt_parameters:
-             normalized_params = dict(
-                 (sql._clause_element_as_expr(c), param)
--                for c, param in stmt_parameters.items()
-+                for c, param in list(stmt_parameters.items())
-             )
-             assert self.isupdate
-             affected_tables = set()
-@@ -1752,7 +1752,7 @@
-             dialect_hints = dict([
-                 (table, hint_text)
-                 for (table, dialect), hint_text in
--                delete_stmt._hints.items()
-+                list(delete_stmt._hints.items())
-                 if dialect in ('*', self.dialect.name)
-             ])
-             if delete_stmt.table in dialect_hints:
-@@ -1868,22 +1868,23 @@
-                                     and not first_pk)
-                 if column.primary_key:
-                     first_pk = True
--            except exc.CompileError, ce:
--                # Py3K
--                #raise exc.CompileError("(in table '%s', column '%s'): %s"
--                #                             % (
--                #                                table.description,
--                #                                column.name,
--                #                                ce.args[0]
--                #                            )) from ce
--                # Py2K
-+            except exc.CompileError as ce:
-+# start Py3K
-                 raise exc.CompileError("(in table '%s', column '%s'): %s"
--                                            % (
-+                                             % (
-                                                 table.description,
-                                                 column.name,
-                                                 ce.args[0]
--                                            )), None, sys.exc_info()[2]
--                # end Py2K
-+                                            )) from ce
-+# end Py3K
-+# start Py2K
-+#                raise exc.CompileError("(in table '%s', column '%s'): %s"
-+#                                            % (
-+#                                                table.description,
-+#                                                column.name,
-+#                                                ce.args[0]
-+#                                            )), None, sys.exc_info()[2]
-+# end Py2K
-
-         const = self.create_table_constraints(table)
-         if const:
-@@ -2036,7 +2037,7 @@
-
-     def get_column_default_string(self, column):
-         if isinstance(column.server_default, schema.DefaultClause):
--            if isinstance(column.server_default.arg, basestring):
-+            if isinstance(column.server_default.arg, str):
-                 return "'%s'" % column.server_default.arg
-             else:
-                 return self.sql_compiler.process(column.server_default.arg)
-@@ -2084,11 +2085,11 @@
-         remote_table = list(constraint._elements.values())[0].column.table
-         text += "FOREIGN KEY(%s) REFERENCES %s (%s)" % (
-             ', '.join(preparer.quote(f.parent.name, f.parent.quote)
--                      for f in constraint._elements.values()),
-+                      for f in list(constraint._elements.values())),
-             self.define_constraint_remote_table(
-                             constraint, remote_table, preparer),
-             ', '.join(preparer.quote(f.column.name, f.column.quote)
--                      for f in constraint._elements.values())
-+                      for f in list(constraint._elements.values()))
-         )
-         text += self.define_constraint_match(constraint)
-         text += self.define_constraint_cascades(constraint)
-@@ -2355,7 +2356,7 @@
-         lc_value = value.lower()
-         return (lc_value in self.reserved_words
-                 or value[0] in self.illegal_initial_characters
--                or not self.legal_characters.match(unicode(value))
-+                or not self.legal_characters.match(str(value))
-                 or (lc_value != value))
-
-     def quote_schema(self, schema, force):
-diff -r 9d0639b9d3be lib/sqlalchemy/sql/expression.py
---- a/lib/sqlalchemy/sql/expression.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/sql/expression.py Sat Apr 27 19:42:17 2013 -0400
-@@ -1375,7 +1375,7 @@
- modifier = _FunctionGenerator(group=False)
-
-
--class _truncated_label(unicode):
-+class _truncated_label(str):
-     """A unicode subclass used to identify symbolic "
-     "names that may require truncation."""
-
-@@ -1395,13 +1395,13 @@
-
-     def __add__(self, other):
-         return _anonymous_label(
--                    unicode(self) +
--                    unicode(other))
-+                    str(self) +
-+                    str(other))
-
-     def __radd__(self, other):
-         return _anonymous_label(
--                    unicode(other) +
--                    unicode(self))
-+                    str(other) +
-+                    str(self))
-
-     def apply_map(self, map_):
-         return self % map_
-@@ -1422,7 +1422,7 @@
-
-
- def _string_or_unprintable(element):
--    if isinstance(element, basestring):
-+    if isinstance(element, str):
-         return element
-     else:
-         try:
-@@ -1486,7 +1486,7 @@
-
-
- def _column_as_key(element):
--    if isinstance(element, basestring):
-+    if isinstance(element, str):
-         return element
-     if hasattr(element, '__clause_element__'):
-         element = element.__clause_element__()
-@@ -1508,8 +1508,8 @@
-         return element
-     elif hasattr(element, '__clause_element__'):
-         return element.__clause_element__()
--    elif isinstance(element, basestring):
--        return TextClause(unicode(element))
-+    elif isinstance(element, str):
-+        return TextClause(str(element))
-     elif isinstance(element, (util.NoneType, bool)):
-         return _const_expr(element)
-     else:
-@@ -1583,8 +1583,8 @@
- def _interpret_as_from(element):
-     insp = inspection.inspect(element, raiseerr=False)
-     if insp is None:
--        if isinstance(element, basestring):
--            return TextClause(unicode(element))
-+        if isinstance(element, str):
-+            return TextClause(str(element))
-     elif hasattr(insp, "selectable"):
-         return insp.selectable
-     raise exc.ArgumentError("FROM expression expected")
-@@ -1914,11 +1914,12 @@
-         return dialect.statement_compiler(dialect, self, **kw)
-
-     def __str__(self):
--        # Py3K
--        #return unicode(self.compile())
--        # Py2K
--        return unicode(self.compile()).encode('ascii', 'backslashreplace')
--        # end Py2K
-+# start Py3K
-+        return str(self.compile())
-+# end Py3K
-+# start Py2K
-+#        return unicode(self.compile()).encode('ascii', 'backslashreplace')
-+# end Py2K
-
-     def __and__(self, other):
-         return and_(self, other)
-@@ -1929,7 +1930,7 @@
-     def __invert__(self):
-         return self._negate()
-
--    def __nonzero__(self):
-+    def __bool__(self):
-         raise TypeError("Boolean value of this clause is not defined")
-
-     def _negate(self):
-@@ -2507,7 +2508,7 @@
-     def update(self, value):
-         self._data.update(value)
-         self._all_cols.clear()
--        self._all_cols.update(self._data.values())
-+        self._all_cols.update(list(self._data.values()))
-
-     def extend(self, iter):
-         self.update((c.key, c) for c in iter)
-@@ -2523,13 +2524,13 @@
-         return and_(*l)
-
-     def __contains__(self, other):
--        if not isinstance(other, basestring):
-+        if not isinstance(other, str):
-             raise exc.ArgumentError("__contains__ requires a string argument")
-         return util.OrderedProperties.__contains__(self, other)
-
-     def __setstate__(self, state):
-         self.__dict__['_data'] = state['_data']
--        self.__dict__['_all_cols'] = util.column_set(self._data.values())
-+        self.__dict__['_all_cols'] = util.column_set(list(self._data.values()))
-
-     def contains_column(self, col):
-         # this has to be done via set() membership
-@@ -3202,7 +3203,7 @@
-                 self._execution_options.union(
-                   {'autocommit': autocommit})
-         if typemap is not None:
--            for key in typemap.keys():
-+            for key in list(typemap.keys()):
-                 typemap[key] = sqltypes.to_instance(typemap[key])
-
-         def repl(m):
-@@ -3236,10 +3237,10 @@
-
-     def _copy_internals(self, clone=_clone, **kw):
-         self.bindparams = dict((b.key, clone(b, **kw))
--                               for b in self.bindparams.values())
-+                               for b in list(self.bindparams.values()))
-
-     def get_children(self, **kwargs):
--        return self.bindparams.values()
-+        return list(self.bindparams.values())
-
-
- class Null(ColumnElement):
-@@ -3750,7 +3751,7 @@
-                     negate=None, modifiers=None):
-         # allow compatibility with libraries that
-         # refer to BinaryExpression directly and pass strings
--        if isinstance(operator, basestring):
-+        if isinstance(operator, str):
-             operator = operators.custom_op(operator)
-         self._orig = (left, right)
-         self.left = _literal_as_text(left).self_group(against=operator)
-@@ -3764,7 +3765,7 @@
-         else:
-             self.modifiers = modifiers
-
--    def __nonzero__(self):
-+    def __bool__(self):
-         if self.operator in (operator.eq, operator.ne):
-             return self.operator(hash(self._orig[0]), hash(self._orig[1]))
-         else:
-@@ -4057,11 +4058,12 @@
-
-     @property
-     def description(self):
--        # Py3K
--        #return self.name
--        # Py2K
--        return self.name.encode('ascii', 'backslashreplace')
--        # end Py2K
-+# start Py3K
-+        return self.name
-+# end Py3K
-+# start Py2K
-+#        return self.name.encode('ascii', 'backslashreplace')
-+# end Py2K
-
-     def as_scalar(self):
-         try:
-@@ -4471,11 +4473,12 @@
-
-     @util.memoized_property
-     def description(self):
--        # Py3K
--        #return self.name
--        # Py2K
--        return self.name.encode('ascii', 'backslashreplace')
--        # end Py2K
-+# start Py3K
-+        return self.name
-+# end Py3K
-+# start Py2K
-+#        return self.name.encode('ascii', 'backslashreplace')
-+# end Py2K
-
-     @_memoized_property
-     def _key_label(self):
-@@ -4602,11 +4605,12 @@
-
-     @util.memoized_property
-     def description(self):
--        # Py3K
--        #return self.name
--        # Py2K
--        return self.name.encode('ascii', 'backslashreplace')
--        # end Py2K
-+# start Py3K
-+        return self.name
-+# end Py3K
-+# start Py2K
-+#        return self.name.encode('ascii', 'backslashreplace')
-+# end Py2K
-
-     def append_column(self, c):
-         self._columns[c.key] = c
-diff -r 9d0639b9d3be lib/sqlalchemy/sql/functions.py
---- a/lib/sqlalchemy/sql/functions.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/sql/functions.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -41,7 +41,7 @@
-         super(_GenericMeta, cls).__init__(clsname, bases, clsdict)
-
-
--class GenericFunction(Function):
-+class GenericFunction(Function, metaclass=_GenericMeta):
-     """Define a 'generic' function.
-
-     A generic function is a pre-established :class:`.Function`
-@@ -112,7 +112,6 @@
-        name is still recognized for backwards-compatibility.
-
-     """
--    __metaclass__ = _GenericMeta
-
-     coerce_arguments = True
-
-diff -r 9d0639b9d3be lib/sqlalchemy/sql/operators.py
---- a/lib/sqlalchemy/sql/operators.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/sql/operators.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -14,8 +14,8 @@
-     getitem, lshift, rshift
-     )
-
--# Py2K
--from operator import (div,)
-+# start Py2K
-+#from operator import (div,)
- # end Py2K
-
- from ..util import symbol
-@@ -789,9 +789,9 @@
-     getitem: 15,
-     mul: 8,
-     truediv: 8,
--    # Py2K
--    div: 8,
--    # end Py2K
-+# start Py2K
-+#    div: 8,
-+# end Py2K
-     mod: 8,
-     neg: 8,
-     add: 7,
-diff -r 9d0639b9d3be lib/sqlalchemy/sql/util.py
---- a/lib/sqlalchemy/sql/util.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/sql/util.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -232,7 +232,7 @@
-
-
- def _quote_ddl_expr(element):
--    if isinstance(element, basestring):
-+    if isinstance(element, str):
-         element = element.replace("'", "''")
-         return "'%s'" % element
-     else:
-@@ -349,7 +349,7 @@
-                 continue
-             try:
-                 col = fk.get_referent(left)
--            except exc.NoReferenceError, nrte:
-+            except exc.NoReferenceError as nrte:
-                 if nrte.table_name == left.name:
-                     raise
-                 else:
-@@ -367,7 +367,7 @@
-                     continue
-                 try:
-                     col = fk.get_referent(b)
--                except exc.NoReferenceError, nrte:
-+                except exc.NoReferenceError as nrte:
-                     if nrte.table_name == b.name:
-                         raise
-                     else:
-@@ -518,15 +518,15 @@
- # so that the resulting objects are pickleable.
- annotated_classes = {}
-
--for cls in expression.__dict__.values() + [schema.Column, schema.Table]:
-+for cls in list(expression.__dict__.values()) + [schema.Column, schema.Table]:
-     if isinstance(cls, type) and issubclass(cls, expression.ClauseElement):
-         if issubclass(cls, expression.ColumnElement):
-             annotation_cls = "AnnotatedColumnElement"
-         else:
-             annotation_cls = "Annotated"
--        exec "class Annotated%s(%s, cls):\n" \
--             "    pass" % (cls.__name__, annotation_cls) in locals()
--        exec "annotated_classes[cls] = Annotated%s" % (cls.__name__,)
-+        exec("class Annotated%s(%s, cls):\n" \
-+             "    pass" % (cls.__name__, annotation_cls), locals())
-+        exec("annotated_classes[cls] = Annotated%s" % (cls.__name__,))
-
-
- def _deep_annotate(element, annotations, exclude=None):
-@@ -765,7 +765,7 @@
-         return self.row[self.map[key]]
-
-     def keys(self):
--        return self.row.keys()
-+        return list(self.row.keys())
-
-
- class ClauseAdapter(visitors.ReplacingCloningVisitor):
-diff -r 9d0639b9d3be lib/sqlalchemy/sql/visitors.py
---- a/lib/sqlalchemy/sql/visitors.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/sql/visitors.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -87,14 +87,12 @@
-         cls._compiler_dispatch = _compiler_dispatch
-
-
--class Visitable(object):
-+class Visitable(object, metaclass=VisitableType):
-     """Base class for visitable objects, applies the
-     ``VisitableType`` metaclass.
-
-     """
-
--    __metaclass__ = VisitableType
--
-
- class ClauseVisitor(object):
-     """Base class for visitor objects which can traverse using
-diff -r 9d0639b9d3be lib/sqlalchemy/testing/__init__.py
---- a/lib/sqlalchemy/testing/__init__.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/testing/__init__.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -1,4 +1,4 @@
--from __future__ import absolute_import
-+
-
- from .warnings import testing_warn, assert_warnings, resetwarnings
-
-diff -r 9d0639b9d3be lib/sqlalchemy/testing/assertions.py
---- a/lib/sqlalchemy/testing/assertions.py     Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/testing/assertions.py     Sat Apr 27 19:42:17 2013 -0400
-@@ -1,4 +1,4 @@
--from __future__ import absolute_import
-+
-
- from . import util as testutil
- from sqlalchemy import pool, orm, util
-@@ -63,7 +63,7 @@
-
-     @decorator
-     def decorate(fn, *args, **kw):
--        if isinstance(db, basestring):
-+        if isinstance(db, str):
-             if not spec(config.db):
-                 return fn(*args, **kw)
-             else:
-@@ -171,9 +171,9 @@
-     try:
-         callable_(*args, **kwargs)
-         assert False, "Callable did not raise an exception"
--    except except_cls, e:
--        assert re.search(msg, unicode(e), re.UNICODE), u"%r !~ %s" % (msg, e)
--        print unicode(e).encode('utf-8')
-+    except except_cls as e:
-+        assert re.search(msg, str(e), re.UNICODE), "%r !~ %s" % (msg, e)
-+        print(str(e).encode('utf-8'))
-
-
- class AssertsCompiledSQL(object):
-@@ -190,12 +190,12 @@
-                 dialect = default.DefaultDialect()
-             elif dialect is None:
-                 dialect = config.db.dialect
--            elif isinstance(dialect, basestring):
-+            elif isinstance(dialect, str):
-                 dialect = create_engine("%s://" % dialect).dialect
-
-         kw = {}
-         if params is not None:
--            kw['column_keys'] = params.keys()
-+            kw['column_keys'] = list(params.keys())
-
-         if isinstance(clause, orm.Query):
-             context = clause._compile_context()
-@@ -205,10 +205,11 @@
-         c = clause.compile(dialect=dialect, **kw)
-
-         param_str = repr(getattr(c, 'params', {}))
--        # Py3K
--        #param_str = param_str.encode('utf-8').decode('ascii', 'ignore')
-+# start Py3K
-+        param_str = param_str.encode('utf-8').decode('ascii', 'ignore')
-+# end Py3K
-
--        print "\nSQL String:\n" + str(c) + param_str
-+        print("\nSQL String:\n" + str(c) + param_str)
-
-         cc = re.sub(r'[\n\t]', '', str(c))
-
-@@ -262,7 +263,7 @@
- class AssertsExecutionResults(object):
-     def assert_result(self, result, class_, *objects):
-         result = list(result)
--        print repr(result)
-+        print(repr(result))
-         self.assert_list(result, class_, objects)
-
-     def assert_list(self, result, class_, list):
-@@ -275,7 +276,7 @@
-     def assert_row(self, class_, rowobj, desc):
-         self.assert_(rowobj.__class__ is class_,
-                      "item class is not " + repr(class_))
--        for key, value in desc.iteritems():
-+        for key, value in desc.items():
-             if isinstance(value, tuple):
-                 if isinstance(value[1], list):
-                     self.assert_list(getattr(rowobj, key), value[0], value[1])
-@@ -300,7 +301,7 @@
-         found = util.IdentitySet(result)
-         expected = set([immutabledict(e) for e in expected])
-
--        for wrong in itertools.ifilterfalse(lambda o: type(o) == cls, found):
-+        for wrong in itertools.filterfalse(lambda o: type(o) == cls, found):
-             fail('Unexpected type "%s", expected "%s"' % (
-                 type(wrong).__name__, cls.__name__))
-
-@@ -311,7 +312,7 @@
-         NOVALUE = object()
-
-         def _compare_item(obj, spec):
--            for key, value in spec.iteritems():
-+            for key, value in spec.items():
-                 if isinstance(value, tuple):
-                     try:
-                         self.assert_unordered_result(
-@@ -352,7 +353,7 @@
-         for rule in rules:
-             if isinstance(rule, dict):
-                 newrule = assertsql.AllOf(*[
--                    assertsql.ExactSQL(k, v) for k, v in rule.iteritems()
-+                    assertsql.ExactSQL(k, v) for k, v in rule.items()
-                 ])
-             else:
-                 newrule = assertsql.ExactSQL(*rule)
-diff -r 9d0639b9d3be lib/sqlalchemy/testing/assertsql.py
---- a/lib/sqlalchemy/testing/assertsql.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/testing/assertsql.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -127,7 +127,7 @@
-             # do a positive compare only
-
-             for param, received in zip(params, _received_parameters):
--                for k, v in param.iteritems():
-+                for k, v in param.items():
-                     if k not in received or received[k] != v:
-                         equivalent = False
-                         break
-@@ -180,7 +180,7 @@
-             all_received = list(_received_parameters)
-             while params:
-                 param = dict(params.pop(0))
--                for k, v in context.compiled.params.iteritems():
-+                for k, v in context.compiled.params.items():
-                     param.setdefault(k, v)
-                 if param not in _received_parameters:
-                     equivalent = False
-@@ -195,9 +195,9 @@
-             all_received = []
-         self._result = equivalent
-         if not self._result:
--            print 'Testing for compiled statement %r partial params '\
-+            print('Testing for compiled statement %r partial params '\
-                 '%r, received %r with params %r' % (self.statement,
--                    all_params, _received_statement, all_received)
-+                    all_params, _received_statement, all_received))
-             self._errmsg = \
-                 'Testing for compiled statement %r partial params %r, '\
-                 'received %r with params %r' % (self.statement,
-@@ -262,7 +262,7 @@
-
-         # oracle+zxjdbc passes a PyStatement when returning into
-
--        query = unicode(query)
-+        query = str(query)
-     if context.engine.name == 'mssql' \
-         and query.endswith('; select scope_identity()'):
-         query = query[:-25]
-diff -r 9d0639b9d3be lib/sqlalchemy/testing/engines.py
---- a/lib/sqlalchemy/testing/engines.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/testing/engines.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -1,4 +1,4 @@
--from __future__ import absolute_import
-+
-
- import types
- import weakref
-@@ -31,18 +31,18 @@
-             fn()
-         except (SystemExit, KeyboardInterrupt):
-             raise
--        except Exception, e:
-+        except Exception as e:
-             warnings.warn(
-                     "testing_reaper couldn't "
-                     "rollback/close connection: %s" % e)
-
-     def rollback_all(self):
--        for rec in self.proxy_refs.keys():
-+        for rec in list(self.proxy_refs.keys()):
-             if rec is not None and rec.is_valid:
-                 self._safe(rec.rollback)
-
-     def close_all(self):
--        for rec in self.proxy_refs.keys():
-+        for rec in list(self.proxy_refs.keys()):
-             if rec is not None:
-                 self._safe(rec._close)
-
-@@ -66,7 +66,7 @@
-
-         self.conns = set()
-
--        for rec in self.testing_engines.keys():
-+        for rec in list(self.testing_engines.keys()):
-             if rec is not config.db:
-                 rec.dispose()
-
-@@ -75,7 +75,7 @@
-         for conn in self.conns:
-             self._safe(conn.close)
-         self.conns = set()
--        for rec in self.testing_engines.keys():
-+        for rec in list(self.testing_engines.keys()):
-             rec.dispose()
-
-     def assert_all_closed(self):
-@@ -160,7 +160,7 @@
-             fn()
-         except (SystemExit, KeyboardInterrupt):
-             raise
--        except Exception, e:
-+        except Exception as e:
-             warnings.warn(
-                     "ReconnectFixture couldn't "
-                     "close connection: %s" % e)
-@@ -353,23 +353,24 @@
-     Callable = object()
-     NoAttribute = object()
-
--    # Py3K
--    #Natives = set([getattr(types, t)
--    #               for t in dir(types) if not t.startswith('_')]). \
--    #               union([type(t) if not isinstance(t, type)
--    #                        else t for t in __builtins__.values()]).\
--    #               difference([getattr(types, t)
--    #                        for t in ('FunctionType', 'BuiltinFunctionType',
--    #                                  'MethodType', 'BuiltinMethodType',
--    #                                  'LambdaType', )])
--    # Py2K
-+# start Py3K
-     Natives = set([getattr(types, t)
-                    for t in dir(types) if not t.startswith('_')]). \
-+                   union([type(t) if not isinstance(t, type)
-+                            else t for t in list(__builtins__.values())]).\
-                    difference([getattr(types, t)
--                           for t in ('FunctionType', 'BuiltinFunctionType',
--                                     'MethodType', 'BuiltinMethodType',
--                                     'LambdaType', 'UnboundMethodType',)])
--    # end Py2K
-+                            for t in ('FunctionType', 'BuiltinFunctionType',
-+                                      'MethodType', 'BuiltinMethodType',
-+                                      'LambdaType', )])
-+# end Py3K
-+# start Py2K
-+#    Natives = set([getattr(types, t)
-+#                   for t in dir(types) if not t.startswith('_')]). \
-+#                   difference([getattr(types, t)
-+#                           for t in ('FunctionType', 'BuiltinFunctionType',
-+#                                     'MethodType', 'BuiltinMethodType',
-+#                                     'LambdaType', 'UnboundMethodType',)])
-+# end Py2K
-
-     def __init__(self):
-         self.buffer = deque()
-diff -r 9d0639b9d3be lib/sqlalchemy/testing/entities.py
---- a/lib/sqlalchemy/testing/entities.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/testing/entities.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -7,7 +7,7 @@
- class BasicEntity(object):
-
-     def __init__(self, **kw):
--        for key, value in kw.iteritems():
-+        for key, value in kw.items():
-             setattr(self, key, value)
-
-     def __repr__(self):
-@@ -67,7 +67,7 @@
-                 a = self
-                 b = other
-
--            for attr in a.__dict__.keys():
-+            for attr in list(a.__dict__.keys()):
-                 if attr.startswith('_'):
-                     continue
-                 value = getattr(a, attr)
-diff -r 9d0639b9d3be lib/sqlalchemy/testing/exclusions.py
---- a/lib/sqlalchemy/testing/exclusions.py     Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/testing/exclusions.py     Sat Apr 27 19:42:17 2013 -0400
-@@ -1,4 +1,4 @@
--from __future__ import with_statement
-+
-
- import operator
- from nose import SkipTest
-@@ -23,10 +23,10 @@
-     def fail_if(self, name='block'):
-         try:
-             yield
--        except Exception, ex:
-+        except Exception as ex:
-             if self.predicate():
--                print ("%s failed as expected (%s): %s " % (
--                    name, self.predicate, str(ex)))
-+                print(("%s failed as expected (%s): %s " % (
-+                    name, self.predicate, str(ex))))
-             else:
-                 raise
-         else:
-@@ -92,7 +92,7 @@
-             return OrPredicate([cls.as_predicate(pred) for pred in predicate])
-         elif isinstance(predicate, tuple):
-             return SpecPredicate(*predicate)
--        elif isinstance(predicate, basestring):
-+        elif isinstance(predicate, str):
-             return SpecPredicate(predicate, None, None)
-         elif util.callable(predicate):
-             return LambdaPredicate(predicate)
-diff -r 9d0639b9d3be lib/sqlalchemy/testing/fixtures.py
---- a/lib/sqlalchemy/testing/fixtures.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/testing/fixtures.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -125,9 +125,9 @@
-             for table in reversed(self.metadata.sorted_tables):
-                 try:
-                     table.delete().execute().close()
--                except sa.exc.DBAPIError, ex:
--                    print >> sys.stderr, "Error emptying table %s: %r" % (
--                        table, ex)
-+                except sa.exc.DBAPIError as ex:
-+                    print("Error emptying table %s: %r" % (
-+                        table, ex), file=sys.stderr)
-
-     def setup(self):
-         self._setup_each_tables()
-@@ -187,10 +187,10 @@
-     def _load_fixtures(cls):
-         """Insert rows as represented by the fixtures() method."""
-         headers, rows = {}, {}
--        for table, data in cls.fixtures().iteritems():
-+        for table, data in cls.fixtures().items():
-             if len(data) < 2:
-                 continue
--            if isinstance(table, basestring):
-+            if isinstance(table, str):
-                 table = cls.tables[table]
-             headers[table] = data[0]
-             rows[table] = data[1:]
-@@ -199,7 +199,7 @@
-                 continue
-             cls.bind.execute(
-                 table.insert(),
--                [dict(zip(headers[table], column_values))
-+                [dict(list(zip(headers[table], column_values)))
-                  for column_values in rows[table]])
-
-
-@@ -284,8 +284,8 @@
-                 cls_registry[classname] = cls
-                 return type.__init__(cls, classname, bases, dict_)
-
--        class _Base(object):
--            __metaclass__ = FindFixture
-+        class _Base(object, metaclass=FindFixture):
-+            pass
-
-         class Basic(BasicEntity, _Base):
-             pass
-diff -r 9d0639b9d3be lib/sqlalchemy/testing/plugin/noseplugin.py
---- a/lib/sqlalchemy/testing/plugin/noseplugin.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/testing/plugin/noseplugin.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -9,10 +9,10 @@
- normally as "from sqlalchemy.testing.plugin import noseplugin".
-
- """
--from __future__ import absolute_import
-+
-
- import os
--import ConfigParser
-+import configparser
-
- from nose.plugins import Plugin
- from nose import SkipTest
-@@ -55,9 +55,9 @@
-
-
- def _list_dbs(*args):
--    print "Available --db options (use --dburi to override)"
-+    print("Available --db options (use --dburi to override)")
-     for macro in sorted(file_config.options('db')):
--        print "%20s\t%s" % (macro, file_config.get('db', macro))
-+        print("%20s\t%s" % (macro, file_config.get('db', macro)))
-     sys.exit(0)
-
-
-@@ -318,7 +318,7 @@
-         opt("--write-profiles", action="store_true", dest="write_profiles", default=False,
-                 help="Write/update profiling data.")
-         global file_config
--        file_config = ConfigParser.ConfigParser()
-+        file_config = configparser.ConfigParser()
-         file_config.read(['setup.cfg', 'test.cfg'])
-
-     def configure(self, options, conf):
-diff -r 9d0639b9d3be lib/sqlalchemy/testing/profiling.py
---- a/lib/sqlalchemy/testing/profiling.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/testing/profiling.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -60,9 +60,9 @@
-             if report:
-                 sort_ = target_opts.get('sort', profile_config['sort'])
-                 limit = target_opts.get('limit', profile_config['limit'])
--                print ("Profile report for target '%s' (%s)" % (
-+                print(("Profile report for target '%s' (%s)" % (
-                     target, filename)
--                    )
-+                    ))
-
-                 stats = load_stats()
-                 stats.sort_stats(*sort_)
-@@ -198,7 +198,7 @@
-         profile_f.close()
-
-     def _write(self):
--        print("Writing profile file %s" % self.fname)
-+        print(("Writing profile file %s" % self.fname))
-         profile_f = open(self.fname, "w")
-         profile_f.write(self._header())
-         for test_key in sorted(self.data):
-@@ -253,11 +253,11 @@
-             else:
-                 line_no, expected_count = expected
-
--            print("Pstats calls: %d Expected %s" % (
-+            print(("Pstats calls: %d Expected %s" % (
-                     callcount,
-                     expected_count
-                 )
--            )
-+            ))
-             stats.print_stats()
-             #stats.print_callers()
-
-diff -r 9d0639b9d3be lib/sqlalchemy/testing/schema.py
---- a/lib/sqlalchemy/testing/schema.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/testing/schema.py Sat Apr 27 19:42:17 2013 -0400
-@@ -11,7 +11,7 @@
- def Table(*args, **kw):
-     """A schema.Table wrapper/hook for dialect-specific tweaks."""
-
--    test_opts = dict([(k, kw.pop(k)) for k in kw.keys()
-+    test_opts = dict([(k, kw.pop(k)) for k in list(kw.keys())
-                       if k.startswith('test_')])
-
-     kw.update(table_options)
-@@ -58,7 +58,7 @@
- def Column(*args, **kw):
-     """A schema.Column wrapper/hook for dialect-specific tweaks."""
-
--    test_opts = dict([(k, kw.pop(k)) for k in kw.keys()
-+    test_opts = dict([(k, kw.pop(k)) for k in list(kw.keys())
-                       if k.startswith('test_')])
-
-     if not config.requirements.foreign_key_ddl.enabled:
-diff -r 9d0639b9d3be lib/sqlalchemy/testing/suite/test_ddl.py
---- a/lib/sqlalchemy/testing/suite/test_ddl.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/testing/suite/test_ddl.py Sat Apr 27 19:42:17 2013 -0400
-@@ -1,4 +1,4 @@
--from __future__ import with_statement
-+
-
- from .. import fixtures, config, util
- from ..config import requirements
-diff -r 9d0639b9d3be lib/sqlalchemy/testing/suite/test_reflection.py
---- a/lib/sqlalchemy/testing/suite/test_reflection.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/testing/suite/test_reflection.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -1,4 +1,4 @@
--from __future__ import with_statement
-+
-
- import sqlalchemy as sa
- from sqlalchemy import exc as sa_exc
-@@ -386,7 +386,7 @@
-                     self.tables.email_addresses, self.tables.dingalings
-         insp = inspect(meta.bind)
-         oid = insp.get_table_oid(table_name, schema)
--        self.assert_(isinstance(oid, (int, long)))
-+        self.assert_(isinstance(oid, int))
-
-     def test_get_table_oid(self):
-         self._test_get_table_oid('users')
-diff -r 9d0639b9d3be lib/sqlalchemy/testing/suite/test_types.py
---- a/lib/sqlalchemy/testing/suite/test_types.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/testing/suite/test_types.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -15,9 +15,9 @@
- class _UnicodeFixture(object):
-     __requires__ = 'unicode_data',
-
--    data = u"Alors vous imaginez ma surprise, au lever du jour, "\
--                u"quand une drôle de petite voix m’a réveillé. Elle "\
--                u"disait: « S’il vous plaît… dessine-moi un mouton! »"
-+    data = "Alors vous imaginez ma surprise, au lever du jour, "\
-+                "quand une drôle de petite voix m’a réveillé. Elle "\
-+                "disait: « S’il vous plaît… dessine-moi un mouton! »"
-
-     @classmethod
-     def define_tables(cls, metadata):
-@@ -47,7 +47,7 @@
-             row,
-             (self.data, )
-         )
--        assert isinstance(row[0], unicode)
-+        assert isinstance(row[0], str)
-
-     def test_round_trip_executemany(self):
-         unicode_table = self.tables.unicode_table
-@@ -58,7 +58,7 @@
-                 {
-                     'unicode_data': self.data,
-                 }
--                for i in xrange(3)
-+                for i in range(3)
-             ]
-         )
-
-@@ -69,22 +69,22 @@
-                 ).fetchall()
-         eq_(
-             rows,
--            [(self.data, ) for i in xrange(3)]
-+            [(self.data, ) for i in range(3)]
-         )
-         for row in rows:
--            assert isinstance(row[0], unicode)
-+            assert isinstance(row[0], str)
-
-     def _test_empty_strings(self):
-         unicode_table = self.tables.unicode_table
-
-         config.db.execute(
-             unicode_table.insert(),
--            {"unicode_data": u''}
-+            {"unicode_data": ''}
-         )
-         row = config.db.execute(
-                     select([unicode_table.c.unicode_data])
-                 ).first()
--        eq_(row, (u'',))
-+        eq_(row, ('',))
-
-
- class UnicodeVarcharTest(_UnicodeFixture, fixtures.TablesTest):
-diff -r 9d0639b9d3be lib/sqlalchemy/testing/util.py
---- a/lib/sqlalchemy/testing/util.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/testing/util.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -32,13 +32,13 @@
-
- def picklers():
-     picklers = set()
--    # Py2K
--    try:
--        import cPickle
--        picklers.add(cPickle)
--    except ImportError:
--        pass
--    # end Py2K
-+# start Py2K
-+#    try:
-+#        import cPickle
-+#        picklers.add(cPickle)
-+#    except ImportError:
-+#        pass
-+# end Py2K
-     import pickle
-     picklers.add(pickle)
-
-@@ -130,8 +130,8 @@
-     try:
-         fn.__name__ = name
-     except TypeError:
--        fn = types.FunctionType(fn.func_code, fn.func_globals, name,
--                          fn.func_defaults, fn.func_closure)
-+        fn = types.FunctionType(fn.__code__, fn.__globals__, name,
-+                          fn.__defaults__, fn.__closure__)
-     return fn
-
-
-diff -r 9d0639b9d3be lib/sqlalchemy/testing/warnings.py
---- a/lib/sqlalchemy/testing/warnings.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/testing/warnings.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -1,4 +1,4 @@
--from __future__ import absolute_import
-+
-
- import warnings
- from .. import exc as sa_exc
-@@ -10,7 +10,7 @@
-
-     filename = "sqlalchemy.testing.warnings"
-     lineno = 1
--    if isinstance(msg, basestring):
-+    if isinstance(msg, str):
-         warnings.warn_explicit(msg, sa_exc.SAWarning, filename, lineno)
-     else:
-         warnings.warn_explicit(msg, filename, lineno)
-diff -r 9d0639b9d3be lib/sqlalchemy/types.py
---- a/lib/sqlalchemy/types.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/types.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -156,8 +156,8 @@
-
-         """
-
--        return self.__class__.column_expression.func_code \
--            is not TypeEngine.column_expression.func_code
-+        return self.__class__.column_expression.__code__ \
-+            is not TypeEngine.column_expression.__code__
-
-     def bind_expression(self, bindvalue):
-         """"Given a bind value (i.e. a :class:`.BindParameter` instance),
-@@ -194,8 +194,8 @@
-
-         """
-
--        return self.__class__.bind_expression.func_code \
--            is not TypeEngine.bind_expression.func_code
-+        return self.__class__.bind_expression.__code__ \
-+            is not TypeEngine.bind_expression.__code__
-
-     def compare_values(self, x, y):
-         """Compare two values for equality."""
-@@ -392,12 +392,13 @@
-             return default.DefaultDialect()
-
-     def __str__(self):
--        # Py3K
--        #return unicode(self.compile())
--        # Py2K
--        return unicode(self.compile()).\
--                        encode('ascii', 'backslashreplace')
--        # end Py2K
-+# start Py3K
-+        return str(self.compile())
-+# end Py3K
-+# start Py2K
-+#        return unicode(self.compile()).\
-+#                        encode('ascii', 'backslashreplace')
-+# end Py2K
-
-     def __init__(self, *args, **kwargs):
-         """Support implementations that were passing arguments"""
-@@ -723,8 +724,8 @@
-
-         """
-
--        return self.__class__.process_bind_param.func_code \
--            is not TypeDecorator.process_bind_param.func_code
-+        return self.__class__.process_bind_param.__code__ \
-+            is not TypeDecorator.process_bind_param.__code__
-
-     def bind_processor(self, dialect):
-         """Provide a bound value processing function for the
-@@ -769,8 +770,8 @@
-         exception throw.
-
-         """
--        return self.__class__.process_result_value.func_code \
--            is not TypeDecorator.process_result_value.func_code
-+        return self.__class__.process_result_value.__code__ \
-+            is not TypeDecorator.process_result_value.__code__
-
-     def result_processor(self, dialect, coltype):
-         """Provide a result value processing function for the given
-@@ -1114,11 +1115,12 @@
-                 self.convert_unicode != 'force':
-                 if self._warn_on_bytestring:
-                     def process(value):
--                        # Py3K
--                        #if isinstance(value, bytes):
--                        # Py2K
--                        if isinstance(value, str):
--                        # end Py2K
-+# start Py3K
-+                        if isinstance(value, bytes):
-+# end Py3K
-+# start Py2K
-+#                        if isinstance(value, str):
-+# end Py2K
-                             util.warn("Unicode type received non-unicode bind "
-                                       "param value.")
-                         return value
-@@ -1130,7 +1132,7 @@
-                 warn_on_bytestring = self._warn_on_bytestring
-
-                 def process(value):
--                    if isinstance(value, unicode):
-+                    if isinstance(value, str):
-                         return encoder(value, self.unicode_error)[0]
-                     elif warn_on_bytestring and value is not None:
-                         util.warn("Unicode type received non-unicode bind "
-@@ -1156,7 +1158,7 @@
-                 # habits.  since we will be getting back unicode
-                 # in most cases, we check for it (decode will fail).
-                 def process(value):
--                    if isinstance(value, unicode):
-+                    if isinstance(value, str):
-                         return value
-                     else:
-                         return to_unicode(value)
-@@ -1171,7 +1173,7 @@
-     @property
-     def python_type(self):
-         if self.convert_unicode:
--            return unicode
-+            return str
-         else:
-             return str
-
-@@ -1318,12 +1320,12 @@
-                 Integer: self.__class__,
-                 Numeric: Numeric,
-             },
--            # Py2K
--            operators.div: {
--                Integer: self.__class__,
--                Numeric: Numeric,
--            },
--            # end Py2K
-+# start Py2K
-+#            operators.div: {
-+#                Integer: self.__class__,
-+#                Numeric: Numeric,
-+#            },
-+# end Py2K
-             operators.truediv: {
-                 Integer: self.__class__,
-                 Numeric: Numeric,
-@@ -1488,12 +1490,12 @@
-                 Numeric: self.__class__,
-                 Integer: self.__class__,
-             },
--            # Py2K
--            operators.div: {
--                Numeric: self.__class__,
--                Integer: self.__class__,
--            },
--            # end Py2K
-+# start Py2K
-+#            operators.div: {
-+#                Numeric: self.__class__,
-+#                Integer: self.__class__,
-+#            },
-+# end Py2K
-             operators.truediv: {
-                 Numeric: self.__class__,
-                 Integer: self.__class__,
-@@ -1558,11 +1560,11 @@
-                 Interval: Interval,
-                 Numeric: self.__class__,
-             },
--            # Py2K
--            operators.div: {
--                Numeric: self.__class__,
--            },
--            # end Py2K
-+# start Py2K
-+#            operators.div: {
-+#                Numeric: self.__class__,
-+#            },
-+# end Py2K
-             operators.truediv: {
-                 Numeric: self.__class__,
-             },
-@@ -1693,11 +1695,12 @@
-
-     @property
-     def python_type(self):
--        # Py3K
--        #return bytes
--        # Py2K
--        return str
--        # end Py2K
-+# start Py3K
-+        return bytes
-+# end Py3K
-+# start Py2K
-+#        return str
-+# end Py2K
-
-     # Python 3 - sqlite3 doesn't need the `Binary` conversion
-     # here, though pg8000 does to indicate "bytea"
-@@ -1715,32 +1718,33 @@
-     # Python 3 has native bytes() type
-     # both sqlite3 and pg8000 seem to return it,
-     # psycopg2 as of 2.5 returns 'memoryview'
--    # Py3K
--    #def result_processor(self, dialect, coltype):
--    #    def process(value):
--    #        if value is not None:
--    #            value = bytes(value)
--    #        return value
--    #    return process
--    # Py2K
-+# start Py3K
-     def result_processor(self, dialect, coltype):
--        if util.jython:
--            def process(value):
--                if value is not None:
--                    if isinstance(value, array.array):
--                        return value.tostring()
--                    return str(value)
--                else:
--                    return None
--        else:
--            process = processors.to_str
-+        def process(value):
-+            if value is not None:
-+                value = bytes(value)
-+            return value
-         return process
--    # end Py2K
-+# end Py3K
-+# start Py2K
-+#    def result_processor(self, dialect, coltype):
-+#        if util.jython:
-+#            def process(value):
-+#                if value is not None:
-+#                    if isinstance(value, array.array):
-+#                        return value.tostring()
-+#                    return str(value)
-+#                else:
-+#                    return None
-+#        else:
-+#            process = processors.to_str
-+#        return process
-+# end Py2K
-
-     def coerce_compared_value(self, op, value):
-         """See :meth:`.TypeEngine.coerce_compared_value` for a description."""
-
--        if isinstance(value, basestring):
-+        if isinstance(value, str):
-             return self
-         else:
-             return super(_Binary, self).coerce_compared_value(op, value)
-@@ -1997,7 +2001,7 @@
-         convert_unicode = kw.pop('convert_unicode', None)
-         if convert_unicode is None:
-             for e in enums:
--                if isinstance(e, unicode):
-+                if isinstance(e, str):
-                     convert_unicode = True
-                     break
-             else:
-@@ -2296,11 +2300,11 @@
-             operators.truediv: {
-                 Numeric: self.__class__
-             },
--            # Py2K
--            operators.div: {
--                Numeric: self.__class__
--            }
--            # end Py2K
-+# start Py2K
-+#            operators.div: {
-+#                Numeric: self.__class__
-+#            }
-+# end Py2K
-         }
-
-     @property
-@@ -2451,11 +2455,12 @@
-
- _type_map = {
-     str: String(),
--    # Py3K
--    #bytes: LargeBinary(),
--    # Py2K
--    unicode: Unicode(),
--    # end Py2K
-+# start Py3K
-+    bytes: LargeBinary(),
-+# end Py3K
-+# start Py2K
-+#    unicode: Unicode(),
-+# end Py2K
-     int: Integer(),
-     float: Numeric(),
-     bool: BOOLEANTYPE,
-diff -r 9d0639b9d3be lib/sqlalchemy/util/_collections.py
---- a/lib/sqlalchemy/util/_collections.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/util/_collections.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -55,7 +55,7 @@
-         t = tuple.__new__(cls, vals)
-         t._labels = []
-         if labels:
--            t.__dict__.update(zip(labels, vals))
-+            t.__dict__.update(list(zip(labels, vals)))
-             t._labels = labels
-         return t
-
-@@ -94,7 +94,7 @@
-         .. versionadded:: 0.8
-
-         """
--        return dict((key, self.__dict__[key]) for key in self.keys())
-+        return dict((key, self.__dict__[key]) for key in list(self.keys()))
-
-
- class ImmutableContainer(object):
-@@ -142,7 +142,7 @@
-         return len(self._data)
-
-     def __iter__(self):
--        return self._data.itervalues()
-+        return iter(self._data.values())
-
-     def __add__(self, other):
-         return list(self) + list(other)
-@@ -189,13 +189,13 @@
-             return default
-
-     def keys(self):
--        return self._data.keys()
-+        return list(self._data.keys())
-
-     def values(self):
--        return self._data.values()
-+        return list(self._data.values())
-
-     def items(self):
--        return self._data.items()
-+        return list(self._data.items())
-
-     def has_key(self, key):
-         return key in self._data
-@@ -242,7 +242,7 @@
-     def update(self, ____sequence=None, **kwargs):
-         if ____sequence is not None:
-             if hasattr(____sequence, 'keys'):
--                for key in ____sequence.keys():
-+                for key in list(____sequence.keys()):
-                     self.__setitem__(key, ____sequence[key])
-             else:
-                 for key, value in ____sequence:
-@@ -270,13 +270,13 @@
-         return list(self._list)
-
-     def iterkeys(self):
--        return iter(self.keys())
-+        return iter(list(self.keys()))
-
-     def items(self):
--        return [(key, self[key]) for key in self.keys()]
-+        return [(key, self[key]) for key in list(self.keys())]
-
-     def iteritems(self):
--        return iter(self.items())
-+        return iter(list(self.items()))
-
-     def __setitem__(self, key, object):
-         if key not in self:
-@@ -470,8 +470,8 @@
-
-         if len(self) > len(other):
-             return False
--        for m in itertools.ifilterfalse(other._members.__contains__,
--                                        self._members.iterkeys()):
-+        for m in itertools.filterfalse(other._members.__contains__,
-+                                        iter(self._members.keys())):
-             return False
-         return True
-
-@@ -491,8 +491,8 @@
-         if len(self) < len(other):
-             return False
-
--        for m in itertools.ifilterfalse(self._members.__contains__,
--                                        other._members.iterkeys()):
-+        for m in itertools.filterfalse(self._members.__contains__,
-+                                        iter(other._members.keys())):
-             return False
-         return True
-
-@@ -582,7 +582,7 @@
-         return result
-
-     def _member_id_tuples(self):
--        return ((id(v), v) for v in self._members.itervalues())
-+        return ((id(v), v) for v in self._members.values())
-
-     def __xor__(self, other):
-         if not isinstance(other, IdentitySet):
-@@ -599,7 +599,7 @@
-         return self
-
-     def copy(self):
--        return type(self)(self._members.itervalues())
-+        return type(self)(iter(self._members.values()))
-
-     __copy__ = copy
-
-@@ -607,13 +607,13 @@
-         return len(self._members)
-
-     def __iter__(self):
--        return self._members.itervalues()
-+        return iter(self._members.values())
-
-     def __hash__(self):
-         raise TypeError('set objects are unhashable')
-
-     def __repr__(self):
--        return '%s(%r)' % (type(self).__name__, self._members.values())
-+        return '%s(%r)' % (type(self).__name__, list(self._members.values()))
-
-
- class WeakSequence(object):
-@@ -623,7 +623,7 @@
-         )
-
-     def __iter__(self):
--        return self._storage.itervalues()
-+        return iter(self._storage.values())
-
-     def __getitem__(self, index):
-         try:
-@@ -754,7 +754,7 @@
-
-     """
-     for elem in x:
--        if not isinstance(elem, basestring) and hasattr(elem, '__iter__'):
-+        if not isinstance(elem, str) and hasattr(elem, '__iter__'):
-             for y in flatten_iterator(elem):
-                 yield y
-         else:
-diff -r 9d0639b9d3be lib/sqlalchemy/util/compat.py
---- a/lib/sqlalchemy/util/compat.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/util/compat.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -43,14 +43,14 @@
-
- if sys.version_info < (2, 6):
-     def next(iter):
--        return iter.next()
-+        return iter.__next__()
- else:
-     next = next
- if py3k_warning:
-     import pickle
- else:
-     try:
--        import cPickle as pickle
-+        import pickle as pickle
-     except ImportError:
-         import pickle
-
-@@ -59,12 +59,13 @@
-     # in newer pythons
-     from cgi import parse_qsl
- else:
--    from urlparse import parse_qsl
-+    from urllib.parse import parse_qsl
-
--# Py3K
--#from inspect import getfullargspec as inspect_getfullargspec
--# Py2K
--from inspect import getargspec as inspect_getfullargspec
-+# start Py3K
-+from inspect import getfullargspec as inspect_getfullargspec
-+# end Py3K
-+# start Py2K
-+#from inspect import getargspec as inspect_getfullargspec
- # end Py2K
-
- if py3k_warning:
-diff -r 9d0639b9d3be lib/sqlalchemy/util/deprecations.py
---- a/lib/sqlalchemy/util/deprecations.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/util/deprecations.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -10,7 +10,7 @@
- from .. import exc
- import warnings
- import re
--from langhelpers import decorator
-+from .langhelpers import decorator
-
-
- def warn_deprecated(msg, stacklevel=3):
-diff -r 9d0639b9d3be lib/sqlalchemy/util/langhelpers.py
---- a/lib/sqlalchemy/util/langhelpers.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/lib/sqlalchemy/util/langhelpers.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -21,10 +21,12 @@
- from .. import exc
- import hashlib
- from . import compat
-+import collections
-
- def md5_hex(x):
--    # Py3K
--    #x = x.encode('utf-8')
-+# start Py3K
-+    x = x.encode('utf-8')
-+# end Py3K
-     m = hashlib.md5()
-     m.update(x)
-     return m.hexdigest()
-@@ -77,8 +79,8 @@
-     used = set(used)
-     for base in bases:
-         pool = itertools.chain((base,),
--                               itertools.imap(lambda i: base + str(i),
--                                              xrange(1000)))
-+                               map(lambda i: base + str(i),
-+                                              range(1000)))
-         for sym in pool:
-             if sym not in used:
-                 used.add(sym)
-@@ -95,7 +97,7 @@
-         if not inspect.isfunction(fn):
-             raise Exception("not a decoratable function")
-         spec = inspect_getfullargspec(fn)
--        names = tuple(spec[0]) + spec[1:3] + (fn.func_name,)
-+        names = tuple(spec[0]) + spec[1:3] + (fn.__name__,)
-         targ_name, fn_name = _unique_symbols(names, 'target', 'fn')
-
-         metadata = dict(target=targ_name, fn=fn_name)
-@@ -104,7 +106,7 @@
-         code = 'lambda %(args)s: %(target)s(%(fn)s, %(apply_kw)s)' % (
-                 metadata)
-         decorated = eval(code, {targ_name: target, fn_name: fn})
--        decorated.func_defaults = getattr(fn, 'im_func', fn).func_defaults
-+        decorated.__defaults__ = getattr(fn, 'im_func', fn).__defaults__
-         return update_wrapper(decorated, fn)
-     return update_wrapper(decorate, target)
-
-@@ -176,7 +178,7 @@
-         ctr = class_.__dict__.get('__init__', False)
-         if (not ctr or
-             not isinstance(ctr, types.FunctionType) or
--                not isinstance(ctr.func_code, types.CodeType)):
-+                not isinstance(ctr.__code__, types.CodeType)):
-             stack.update(class_.__bases__)
-             continue
-
-@@ -194,7 +196,7 @@
-     from inspect import CO_VARKEYWORDS
-
-     def inspect_func_args(fn):
--        co = fn.func_code
-+        co = fn.__code__
-         nargs = co.co_argcount
-         names = co.co_varnames
-         args = list(names[:nargs])
-@@ -250,7 +252,7 @@
-        'apply_pos': '(self, a, b, c, **d)'}
-
-     """
--    if callable(fn):
-+    if isinstance(fn, collections.Callable):
-         spec = inspect_getfullargspec(fn)
-     else:
-         # we accept an existing argspec...
-@@ -263,22 +265,23 @@
-     else:
-         self_arg = None
-
--    # Py3K
--    #apply_pos = inspect.formatargspec(spec[0], spec[1],
--    #    spec[2], None, spec[4])
--    #num_defaults = 0
--    #if spec[3]:
--    #    num_defaults += len(spec[3])
--    #if spec[4]:
--    #    num_defaults += len(spec[4])
--    #name_args = spec[0] + spec[4]
--    # Py2K
--    apply_pos = inspect.formatargspec(spec[0], spec[1], spec[2])
-+# start Py3K
-+    apply_pos = inspect.formatargspec(spec[0], spec[1],
-+        spec[2], None, spec[4])
-     num_defaults = 0
-     if spec[3]:
-         num_defaults += len(spec[3])
--    name_args = spec[0]
--    # end Py2K
-+    if spec[4]:
-+        num_defaults += len(spec[4])
-+    name_args = spec[0] + spec[4]
-+# end Py3K
-+# start Py2K
-+#    apply_pos = inspect.formatargspec(spec[0], spec[1], spec[2])
-+#    num_defaults = 0
-+#    if spec[3]:
-+#        num_defaults += len(spec[3])
-+#    name_args = spec[0]
-+# end Py2K
-
-     if num_defaults:
-         defaulted_vals = name_args[0 - num_defaults:]
-@@ -341,8 +344,8 @@
-
-     """
-
--    if isinstance(func_or_cls, types.MethodType) and not func_or_cls.im_self:
--        return func_or_cls.im_func
-+    if isinstance(func_or_cls, types.MethodType) and not func_or_cls.__self__:
-+        return func_or_cls.__func__
-     else:
-         return func_or_cls
-
-@@ -399,7 +402,7 @@
-
-     """
-     def __init__(self, meth):
--        self.target = meth.im_self
-+        self.target = meth.__self__
-         self.name = meth.__name__
-
-     def __call__(self, *arg, **kw):
-@@ -419,32 +422,34 @@
-     will not be descended.
-
-     """
--    # Py2K
--    if isinstance(cls, types.ClassType):
--        return list()
--    # end Py2K
-+# start Py2K
-+#    if isinstance(cls, types.ClassType):
-+#        return list()
-+# end Py2K
-     hier = set([cls])
-     process = list(cls.__mro__)
-     while process:
-         c = process.pop()
--        # Py2K
--        if isinstance(c, types.ClassType):
--            continue
-+# start Py2K
-+#        if isinstance(c, types.ClassType):
-+#            continue
-+#        for b in (_ for _ in c.__bases__
-+#                  if _ not in hier and not isinstance(_, types.ClassType)):
-+# end Py2K
-+# start Py3K
-         for b in (_ for _ in c.__bases__
--                  if _ not in hier and not isinstance(_, types.ClassType)):
--        # end Py2K
--        # Py3K
--        #for b in (_ for _ in c.__bases__
--        #          if _ not in hier):
-+                  if _ not in hier):
-+# end Py3K
-             process.append(b)
-             hier.add(b)
--        # Py3K
--        #if c.__module__ == 'builtins' or not hasattr(c, '__subclasses__'):
--        #    continue
--        # Py2K
--        if c.__module__ == '__builtin__' or not hasattr(c, '__subclasses__'):
-+# start Py3K
-+        if c.__module__ == 'builtins' or not hasattr(c, '__subclasses__'):
-             continue
--        # end Py2K
-+# end Py3K
-+# start Py2K
-+#        if c.__module__ == '__builtin__' or not hasattr(c, '__subclasses__'):
-+#            continue
-+# end Py2K
-         for s in [_ for _ in c.__subclasses__() if _ not in hier]:
-             process.append(s)
-             hier.add(s)
-@@ -501,9 +506,9 @@
-               "return %(name)s.%(method)s%(d_args)s" % locals())
-
-         env = from_instance is not None and {name: from_instance} or {}
--        exec py in env
-+        exec(py, env)
-         try:
--            env[method].func_defaults = fn.func_defaults
-+            env[method].__defaults__ = fn.__defaults__
-         except AttributeError:
-             pass
-         setattr(into_cls, method, env[method])
-@@ -512,11 +517,12 @@
- def methods_equivalent(meth1, meth2):
-     """Return True if the two methods are the same implementation."""
-
--    # Py3K
--    #return getattr(meth1, '__func__', meth1) is getattr(meth2, '__func__', meth2)
--    # Py2K
--    return getattr(meth1, 'im_func', meth1) is getattr(meth2, 'im_func', meth2)
--    # end Py2K
-+# start Py3K
-+    return getattr(meth1, '__func__', meth1) is getattr(meth2, '__func__', meth2)
-+# end Py3K
-+# start Py2K
-+#    return getattr(meth1, 'im_func', meth1) is getattr(meth2, 'im_func', meth2)
-+# end Py2K
-
-
- def as_interface(obj, cls=None, methods=None, required=None):
-@@ -589,7 +595,7 @@
-     for method, impl in dictlike_iteritems(obj):
-         if method not in interface:
-             raise TypeError("%r: unknown in this interface" % method)
--        if not callable(impl):
-+        if not isinstance(impl, collections.Callable):
-             raise TypeError("%r=%r is not callable" % (method, impl))
-         setattr(AnonymousInterface, method, staticmethod(impl))
-         found.add(method)
-@@ -753,7 +759,7 @@
-
- # from paste.deploy.converters
- def asbool(obj):
--    if isinstance(obj, (str, unicode)):
-+    if isinstance(obj, str):
-         obj = obj.strip().lower()
-         if obj in ['true', 'yes', 'on', 'y', 't', '1']:
-             return True
-@@ -814,13 +820,13 @@
-     """Return a threadsafe counter function."""
-
-     lock = threading.Lock()
--    counter = itertools.count(1L)
-+    counter = itertools.count(1)
-
-     # avoid the 2to3 "next" transformation...
-     def _next():
-         lock.acquire()
-         try:
--            return counter.next()
-+            return next(counter)
-         finally:
-             lock.release()
-
-@@ -876,15 +882,16 @@
- def dictlike_iteritems(dictlike):
-     """Return a (key, value) iterator for almost any dict-like object."""
-
--    # Py3K
--    #if hasattr(dictlike, 'items'):
--    #    return dictlike.items()
--    # Py2K
--    if hasattr(dictlike, 'iteritems'):
--        return dictlike.iteritems()
--    elif hasattr(dictlike, 'items'):
--        return iter(dictlike.items())
--    # end Py2K
-+# start Py3K
-+    if hasattr(dictlike, 'items'):
-+        return list(dictlike.items())
-+# end Py3K
-+# start Py2K
-+#    if hasattr(dictlike, 'iteritems'):
-+#        return dictlike.iteritems()
-+#    elif hasattr(dictlike, 'items'):
-+#        return iter(dictlike.items())
-+# end Py2K
-
-     getter = getattr(dictlike, '__getitem__', getattr(dictlike, 'get', None))
-     if getter is None:
-@@ -893,11 +900,11 @@
-
-     if hasattr(dictlike, 'iterkeys'):
-         def iterator():
--            for key in dictlike.iterkeys():
-+            for key in dictlike.keys():
-                 yield key, getter(key)
-         return iterator()
-     elif hasattr(dictlike, 'keys'):
--        return iter((key, getter(key)) for key in dictlike.keys())
-+        return iter((key, getter(key)) for key in list(dictlike.keys()))
-     else:
-         raise TypeError(
-             "Object '%r' is not dict-like" % dictlike)
-@@ -1034,7 +1041,7 @@
-        be controlled.
-
-     """
--    if isinstance(msg, basestring):
-+    if isinstance(msg, str):
-         warnings.warn(msg, exc.SAWarning, stacklevel=stacklevel)
-     else:
-         warnings.warn(msg, stacklevel=stacklevel)
-diff -r 9d0639b9d3be test/aaa_profiling/test_compiler.py
---- a/test/aaa_profiling/test_compiler.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/aaa_profiling/test_compiler.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -29,7 +29,7 @@
-             for c in t.c:
-                 c.type._type_affinity
-         from sqlalchemy import types
--        for t in types._type_map.values():
-+        for t in list(types._type_map.values()):
-             t._type_affinity
-
-         cls.dialect = default.DefaultDialect()
-diff -r 9d0639b9d3be test/aaa_profiling/test_memusage.py
---- a/test/aaa_profiling/test_memusage.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/aaa_profiling/test_memusage.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -47,7 +47,7 @@
-                 gc_collect()
-                 samples[x] = len(get_objects_skipping_sqlite_issue())
-
--            print "sample gc sizes:", samples
-+            print("sample gc sizes:", samples)
-
-             assert len(_sessions) == 0
-
-diff -r 9d0639b9d3be test/aaa_profiling/test_orm.py
---- a/test/aaa_profiling/test_orm.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/aaa_profiling/test_orm.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -144,7 +144,7 @@
-
-         child.insert().execute([
-             {'id':i, 'data':'c%d' % i}
--            for i in xrange(1, 251)
-+            for i in range(1, 251)
-         ])
-         parent.insert().execute([
-             {
-@@ -152,7 +152,7 @@
-                 'data':'p%dc%d' % (i, (i % 250) + 1),
-                 'child_id':(i % 250) + 1
-             }
--            for i in xrange(1, 1000)
-+            for i in range(1, 1000)
-         ])
-
-     def test_many_to_one_load_no_identity(self):
-@@ -234,11 +234,11 @@
-         s = Session()
-         s.add_all([
-             A(id=i,
--                bs=[B(id=(i * 5) + j) for j in xrange(1, 5)],
-+                bs=[B(id=(i * 5) + j) for j in range(1, 5)],
-                 c=C(id=i),
--                ds=[D(id=(i * 5) + j) for j in xrange(1, 5)]
-+                ds=[D(id=(i * 5) + j) for j in range(1, 5)]
-             )
--            for i in xrange(1, 5)
-+            for i in range(1, 5)
-         ])
-         s.commit()
-
-@@ -249,11 +249,11 @@
-         s = Session()
-         for a in [
-             A(id=i,
--                bs=[B(id=(i * 5) + j) for j in xrange(1, 5)],
-+                bs=[B(id=(i * 5) + j) for j in range(1, 5)],
-                 c=C(id=i),
--                ds=[D(id=(i * 5) + j) for j in xrange(1, 5)]
-+                ds=[D(id=(i * 5) + j) for j in range(1, 5)]
-             )
--            for i in xrange(1, 5)
-+            for i in range(1, 5)
-         ]:
-             s.merge(a)
-
-diff -r 9d0639b9d3be test/aaa_profiling/test_resultset.py
---- a/test/aaa_profiling/test_resultset.py     Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/aaa_profiling/test_resultset.py     Sat Apr 27 19:42:17 2013 -0400
-@@ -19,10 +19,10 @@
-
-     def setup(self):
-         metadata.create_all()
--        t.insert().execute([dict(('field%d' % fnum, u'value%d' % fnum)
-+        t.insert().execute([dict(('field%d' % fnum, 'value%d' % fnum)
-                            for fnum in range(NUM_FIELDS)) for r_num in
-                            range(NUM_RECORDS)])
--        t2.insert().execute([dict(('field%d' % fnum, u'value%d' % fnum)
-+        t2.insert().execute([dict(('field%d' % fnum, 'value%d' % fnum)
-                             for fnum in range(NUM_FIELDS)) for r_num in
-                             range(NUM_RECORDS)])
-
-@@ -88,7 +88,7 @@
-
-         keymap = {}
-         for index, (keyobjs, processor, values) in \
--            enumerate(zip(keys, processors, row)):
-+            enumerate(list(zip(keys, processors, row))):
-             for key in keyobjs:
-                 keymap[key] = (processor, key, index)
-             keymap[index] = (processor, key, index)
-diff -r 9d0639b9d3be test/aaa_profiling/test_zoomark.py
---- a/test/aaa_profiling/test_zoomark.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/aaa_profiling/test_zoomark.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -72,68 +72,68 @@
-         Zoo = metadata.tables['Zoo']
-         Animal = metadata.tables['Animal']
-         engine = metadata.bind
--        wap = engine.execute(Zoo.insert(), Name=u'Wild Animal Park',
-+        wap = engine.execute(Zoo.insert(), Name='Wild Animal Park',
-                                    Founded=datetime.date(2000, 1, 1),
-                                    Opens=datetime.time(8, 15, 59),
-                                    LastEscape=
-                                   datetime.datetime(2004, 7, 29, 5, 6, 7),
-                                   Admission=4.95).inserted_primary_key[0]
--        sdz = engine.execute(Zoo.insert(), Name=u'San Diego Zoo',
-+        sdz = engine.execute(Zoo.insert(), Name='San Diego Zoo',
-                                    Founded=datetime.date(1935, 9, 13),
-                                    Opens=datetime.time(9, 0, 0),
-                                    Admission=0).inserted_primary_key[0]
--        engine.execute(Zoo.insert(inline=True), Name=u'Montr\xe9al Biod\xf4me',
-+        engine.execute(Zoo.insert(inline=True), Name='Montr\xe9al Biod\xf4me',
-                 Founded=datetime.date(1992, 6, 19),
-                 Opens=datetime.time(9, 0, 0), Admission=11.75)
--        seaworld = engine.execute(Zoo.insert(), Name=u'Sea_World',
-+        seaworld = engine.execute(Zoo.insert(), Name='Sea_World',
-                 Admission=60).inserted_primary_key[0]
-
-         # Let's add a crazy futuristic Zoo to test large date values.
-
--        lp = engine.execute(Zoo.insert(), Name=u'Luna Park',
-+        lp = engine.execute(Zoo.insert(), Name='Luna Park',
-                                   Founded=datetime.date(2072, 7, 17),
-                                   Opens=datetime.time(0, 0, 0),
-                                   Admission=134.95).inserted_primary_key[0]
-
-         # Animals
-
--        leopardid = engine.execute(Animal.insert(), Species=u'Leopard',
-+        leopardid = engine.execute(Animal.insert(), Species='Leopard',
-                 Lifespan=73.5).inserted_primary_key[0]
-         engine.execute(Animal.update(Animal.c.ID == leopardid), ZooID=wap,
-                 LastEscape=datetime.datetime( 2004, 12, 21, 8, 15, 0, 999907,)
-                 )
--        lion = engine.execute(Animal.insert(), Species=u'Lion',
-+        lion = engine.execute(Animal.insert(), Species='Lion',
-                 ZooID=wap).inserted_primary_key[0]
--        engine.execute(Animal.insert(), Species=u'Slug', Legs=1, Lifespan=.75)
--        tiger = engine.execute(Animal.insert(), Species=u'Tiger',
-+        engine.execute(Animal.insert(), Species='Slug', Legs=1, Lifespan=.75)
-+        tiger = engine.execute(Animal.insert(), Species='Tiger',
-                 ZooID=sdz).inserted_primary_key[0]
-
-         # Override Legs.default with itself just to make sure it works.
-
--        engine.execute(Animal.insert(inline=True), Species=u'Bear', Legs=4)
--        engine.execute(Animal.insert(inline=True), Species=u'Ostrich', Legs=2,
-+        engine.execute(Animal.insert(inline=True), Species='Bear', Legs=4)
-+        engine.execute(Animal.insert(inline=True), Species='Ostrich', Legs=2,
-                 Lifespan=103.2)
--        engine.execute(Animal.insert(inline=True), Species=u'Centipede',
-+        engine.execute(Animal.insert(inline=True), Species='Centipede',
-                 Legs=100)
--        emp = engine.execute(Animal.insert(), Species=u'Emperor Penguin',
-+        emp = engine.execute(Animal.insert(), Species='Emperor Penguin',
-                 Legs=2, ZooID=seaworld).inserted_primary_key[0]
--        adelie = engine.execute(Animal.insert(), Species=u'Adelie Penguin',
-+        adelie = engine.execute(Animal.insert(), Species='Adelie Penguin',
-                 Legs=2, ZooID=seaworld).inserted_primary_key[0]
--        engine.execute(Animal.insert(inline=True), Species=u'Millipede',
-+        engine.execute(Animal.insert(inline=True), Species='Millipede',
-                 Legs=1000000, ZooID=sdz)
-
-         # Add a mother and child to test relationships
-
--        bai_yun = engine.execute(Animal.insert(), Species=u'Ape',
--                Name=u'Bai Yun', Legs=2).inserted_primary_key[0]
--        engine.execute(Animal.insert(inline=True), Species=u'Ape',
--                Name=u'Hua Mei', Legs=2, MotherID=bai_yun)
-+        bai_yun = engine.execute(Animal.insert(), Species='Ape',
-+                Name='Bai Yun', Legs=2).inserted_primary_key[0]
-+        engine.execute(Animal.insert(inline=True), Species='Ape',
-+                Name='Hua Mei', Legs=2, MotherID=bai_yun)
-
-     def test_baseline_2_insert(self):
-         Animal = metadata.tables['Animal']
-         i = Animal.insert(inline=True)
--        for x in xrange(ITERATIONS):
--            tick = i.execute(Species=u'Tick', Name=u'Tick %d' % x,
-+        for x in range(ITERATIONS):
-+            tick = i.execute(Species='Tick', Name='Tick %d' % x,
-                              Legs=8)
-
-     def test_baseline_3_properties(self):
-@@ -146,28 +146,28 @@
-
-             return list(engine.execute(select).first())
-
--        for x in xrange(ITERATIONS):
-+        for x in range(ITERATIONS):
-
-             # Zoos
-
-             WAP = fullobject(Zoo.select(Zoo.c.Name
--                             == u'Wild Animal Park'))
-+                             == 'Wild Animal Park'))
-             SDZ = fullobject(Zoo.select(Zoo.c.Founded
-                              == datetime.date(1935, 9, 13)))
-             Biodome = fullobject(Zoo.select(Zoo.c.Name
--                                 == u'Montr\xe9al Biod\xf4me'))
-+                                 == 'Montr\xe9al Biod\xf4me'))
-             seaworld = fullobject(Zoo.select(Zoo.c.Admission
-                                   == float(60)))
-
-             # Animals
-
-             leopard = fullobject(Animal.select(Animal.c.Species
--                                 == u'Leopard'))
-+                                 == 'Leopard'))
-             ostrich = fullobject(Animal.select(Animal.c.Species
--                                 == u'Ostrich'))
-+                                 == 'Ostrich'))
-             millipede = fullobject(Animal.select(Animal.c.Legs
-                                    == 1000000))
--            ticks = fullobject(Animal.select(Animal.c.Species == u'Tick'
-+            ticks = fullobject(Animal.select(Animal.c.Species == 'Tick'
-                                ))
-
-     def test_baseline_4_expressions(self):
-@@ -180,7 +180,7 @@
-
-             return [list(row) for row in engine.execute(select).fetchall()]
-
--        for x in xrange(ITERATIONS):
-+        for x in range(ITERATIONS):
-             assert len(fulltable(Zoo.select())) == 5
-             assert len(fulltable(Animal.select())) == ITERATIONS + 12
-             assert len(fulltable(Animal.select(Animal.c.Legs == 4))) \
-@@ -194,9 +194,9 @@
-             assert len(fulltable(Animal.select(Animal.c.Lifespan
-                        > 70))) == 2
-             assert len(fulltable(Animal.select(Animal.c.Species.
--                        startswith(u'L')))) == 2
-+                        startswith('L')))) == 2
-             assert len(fulltable(Animal.select(Animal.c.Species.
--                        endswith(u'pede')))) == 2
-+                        endswith('pede')))) == 2
-             assert len(fulltable(Animal.select(Animal.c.LastEscape
-                        != None))) == 1
-             assert len(fulltable(Animal.select(None
-@@ -204,10 +204,10 @@
-
-             # In operator (containedby)
-
--            assert len(fulltable(Animal.select(Animal.c.Species.like(u'%pede%'
-+            assert len(fulltable(Animal.select(Animal.c.Species.like('%pede%'
-                        )))) == 2
--            assert len(fulltable(Animal.select(Animal.c.Species.in_([u'Lion'
--                       , u'Tiger', u'Bear'])))) == 3
-+            assert len(fulltable(Animal.select(Animal.c.Species.in_(['Lion'
-+                       , 'Tiger', 'Bear'])))) == 3
-
-             # Try In with cell references
-             class thing(object):
-@@ -215,20 +215,20 @@
-
-
-             pet, pet2 = thing(), thing()
--            pet.Name, pet2.Name = u'Slug', u'Ostrich'
-+            pet.Name, pet2.Name = 'Slug', 'Ostrich'
-             assert len(fulltable(Animal.select(Animal.c.Species.in_([pet.Name,
-                        pet2.Name])))) == 2
-
-             # logic and other functions
-
--            assert len(fulltable(Animal.select(Animal.c.Species.like(u'Slug'
-+            assert len(fulltable(Animal.select(Animal.c.Species.like('Slug'
-                        )))) == 1
--            assert len(fulltable(Animal.select(Animal.c.Species.like(u'%pede%'
-+            assert len(fulltable(Animal.select(Animal.c.Species.like('%pede%'
-                        )))) == 2
--            name = u'Lion'
-+            name = 'Lion'
-             assert len(fulltable(Animal.select(func.length(Animal.c.Species)
-                        == len(name)))) == ITERATIONS + 3
--            assert len(fulltable(Animal.select(Animal.c.Species.like(u'%i%'
-+            assert len(fulltable(Animal.select(Animal.c.Species.like('%i%'
-                        )))) == ITERATIONS + 7
-
-             # Test now(), today(), year(), month(), day()
-@@ -250,7 +250,7 @@
-         Zoo = metadata.tables['Zoo']
-         engine = metadata.bind
-
--        for x in xrange(ITERATIONS):
-+        for x in range(ITERATIONS):
-
-             # views
-
-@@ -274,7 +274,7 @@
-             for species, lifespan in engine.execute(select([Animal.c.Species,
-                     Animal.c.Lifespan])).fetchall():
-                 assert lifespan == expected[species]
--            expected = [u'Montr\xe9al Biod\xf4me', 'Wild Animal Park']
-+            expected = ['Montr\xe9al Biod\xf4me', 'Wild Animal Park']
-             e = select([Zoo.c.Name], and_(Zoo.c.Founded != None,
-                        Zoo.c.Founded <= func.current_timestamp(),
-                        Zoo.c.Founded >= datetime.date(1990, 1, 1)))
-@@ -290,21 +290,21 @@
-     def test_baseline_6_editing(self):
-         Zoo = metadata.tables['Zoo']
-         engine = metadata.bind
--        for x in xrange(ITERATIONS):
-+        for x in range(ITERATIONS):
-
-             # Edit
-
--            SDZ = engine.execute(Zoo.select(Zoo.c.Name == u'San Diego Zoo'
-+            SDZ = engine.execute(Zoo.select(Zoo.c.Name == 'San Diego Zoo'
-                              )).first()
-             engine.execute(Zoo.update(Zoo.c.ID == SDZ['ID'
--                       ]), Name=u'The San Diego Zoo',
-+                       ]), Name='The San Diego Zoo',
-                                   Founded=datetime.date(1900, 1, 1),
-                                   Opens=datetime.time(7, 30, 0),
-                                   Admission='35.00')
-
-             # Test edits
-
--            SDZ = engine.execute(Zoo.select(Zoo.c.Name == u'The San Diego Zoo'
-+            SDZ = engine.execute(Zoo.select(Zoo.c.Name == 'The San Diego Zoo'
-                              )).first()
-             assert SDZ['Founded'] == datetime.date(1900, 1, 1), \
-                 SDZ['Founded']
-@@ -312,14 +312,14 @@
-             # Change it back
-
-             engine.execute(Zoo.update(Zoo.c.ID == SDZ['ID'
--                       ]), Name=u'San Diego Zoo',
-+                       ]), Name='San Diego Zoo',
-                                   Founded=datetime.date(1935, 9, 13),
-                                   Opens=datetime.time(9, 0, 0),
-                                   Admission='0')
-
-             # Test re-edits
-
--            SDZ = engine.execute(Zoo.select(Zoo.c.Name == u'San Diego Zoo'
-+            SDZ = engine.execute(Zoo.select(Zoo.c.Name == 'San Diego Zoo'
-                              )).first()
-             assert SDZ['Founded'] == datetime.date(1935, 9, 13)
-
-@@ -333,14 +333,14 @@
-
-             return [list(row) for row in engine.execute(select).fetchall()]
-
--        for x in xrange(ITERATIONS):
-+        for x in range(ITERATIONS):
-             za = fulltable(select([Zoo.c.ID] + list(Animal.c),
--                           Zoo.c.Name == u'San Diego Zoo',
-+                           Zoo.c.Name == 'San Diego Zoo',
-                            from_obj=[join(Zoo, Animal)]))
--            SDZ = Zoo.select(Zoo.c.Name == u'San Diego Zoo')
-+            SDZ = Zoo.select(Zoo.c.Name == 'San Diego Zoo')
-             e = fulltable(select([Zoo.c.ID, Animal.c.ID],
--                          and_(Zoo.c.Name == u'San Diego Zoo',
--                          Animal.c.Species == u'Leopard'),
-+                          and_(Zoo.c.Name == 'San Diego Zoo',
-+                          Animal.c.Species == 'Leopard'),
-                           from_obj=[join(Zoo, Animal)]))
-
-             # Now try the same query with INNER, LEFT, and RIGHT JOINs.
-diff -r 9d0639b9d3be test/aaa_profiling/test_zoomark_orm.py
---- a/test/aaa_profiling/test_zoomark_orm.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/aaa_profiling/test_zoomark_orm.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -75,14 +75,14 @@
-         class Zoo(object):
-
-             def __init__(self, **kwargs):
--                for k, v in kwargs.iteritems():
-+                for k, v in kwargs.items():
-                     setattr(self, k, v)
-
-
-         class Animal(object):
-
-             def __init__(self, **kwargs):
--                for k, v in kwargs.iteritems():
-+                for k, v in kwargs.items():
-                     setattr(self, k, v)
-
-
-@@ -90,93 +90,93 @@
-         mapper(Animal, animal)
-
-     def test_baseline_1a_populate(self):
--        wap = Zoo(Name=u'Wild Animal Park', Founded=datetime.date(2000,
-+        wap = Zoo(Name='Wild Animal Park', Founded=datetime.date(2000,
-                   1, 1), Opens=datetime.time(8, 15, 59),
-                   LastEscape=datetime.datetime( 2004, 7, 29, 5, 6, 7, ),
-                   Admission=4.95)
-         session.add(wap)
--        sdz = Zoo(Name=u'San Diego Zoo', Founded=datetime.date(1835, 9,
-+        sdz = Zoo(Name='San Diego Zoo', Founded=datetime.date(1835, 9,
-                   13), Opens=datetime.time(9, 0, 0), Admission=0)
-         session.add(sdz)
--        bio = Zoo(Name=u'Montr\xe9al Biod\xf4me',
-+        bio = Zoo(Name='Montr\xe9al Biod\xf4me',
-                   Founded=datetime.date(1992, 6, 19),
-                   Opens=datetime.time(9, 0, 0), Admission=11.75)
-         session.add(bio)
--        seaworld = Zoo(Name=u'Sea_World', Admission=60)
-+        seaworld = Zoo(Name='Sea_World', Admission=60)
-         session.add(seaworld)
-
-         # Let's add a crazy futuristic Zoo to test large date values.
-
--        lp = Zoo(Name=u'Luna Park', Founded=datetime.date(2072, 7, 17),
-+        lp = Zoo(Name='Luna Park', Founded=datetime.date(2072, 7, 17),
-                  Opens=datetime.time(0, 0, 0), Admission=134.95)
-         session.add(lp)
-         session.flush()
-
-         # Animals
-
--        leopard = Animal(Species=u'Leopard', Lifespan=73.5)
-+        leopard = Animal(Species='Leopard', Lifespan=73.5)
-         session.add(leopard)
-         leopard.ZooID = wap.ID
-         leopard.LastEscape = \
-                 datetime.datetime(2004, 12, 21, 8, 15, 0, 999907, )
--        session.add(Animal(Species=u'Lion', ZooID=wap.ID))
--        session.add(Animal(Species=u'Slug', Legs=1, Lifespan=.75))
--        session.add(Animal(Species=u'Tiger', ZooID=sdz.ID))
-+        session.add(Animal(Species='Lion', ZooID=wap.ID))
-+        session.add(Animal(Species='Slug', Legs=1, Lifespan=.75))
-+        session.add(Animal(Species='Tiger', ZooID=sdz.ID))
-
-         # Override Legs.default with itself just to make sure it works.
-
--        session.add(Animal(Species=u'Bear', Legs=4))
--        session.add(Animal(Species=u'Ostrich', Legs=2, Lifespan=103.2))
--        session.add(Animal(Species=u'Centipede', Legs=100))
--        session.add(Animal(Species=u'Emperor Penguin', Legs=2,
-+        session.add(Animal(Species='Bear', Legs=4))
-+        session.add(Animal(Species='Ostrich', Legs=2, Lifespan=103.2))
-+        session.add(Animal(Species='Centipede', Legs=100))
-+        session.add(Animal(Species='Emperor Penguin', Legs=2,
-                     ZooID=seaworld.ID))
--        session.add(Animal(Species=u'Adelie Penguin', Legs=2,
-+        session.add(Animal(Species='Adelie Penguin', Legs=2,
-                     ZooID=seaworld.ID))
--        session.add(Animal(Species=u'Millipede', Legs=1000000,
-+        session.add(Animal(Species='Millipede', Legs=1000000,
-                     ZooID=sdz.ID))
-
-         # Add a mother and child to test relationships
-
--        bai_yun = Animal(Species=u'Ape', Nameu=u'Bai Yun', Legs=2)
-+        bai_yun = Animal(Species='Ape', Nameu='Bai Yun', Legs=2)
-         session.add(bai_yun)
--        session.add(Animal(Species=u'Ape', Name=u'Hua Mei', Legs=2,
-+        session.add(Animal(Species='Ape', Name='Hua Mei', Legs=2,
-                     MotherID=bai_yun.ID))
-         session.flush()
-         session.commit()
-
-     def test_baseline_2_insert(self):
--        for x in xrange(ITERATIONS):
--            session.add(Animal(Species=u'Tick', Name=u'Tick %d' % x,
-+        for x in range(ITERATIONS):
-+            session.add(Animal(Species='Tick', Name='Tick %d' % x,
-                         Legs=8))
-         session.flush()
-
-     def test_baseline_3_properties(self):
--        for x in xrange(ITERATIONS):
-+        for x in range(ITERATIONS):
-
-             # Zoos
-
-             WAP = list(session.query(Zoo).filter(Zoo.Name
--                       == u'Wild Animal Park'))
-+                       == 'Wild Animal Park'))
-             SDZ = list(session.query(Zoo).filter(Zoo.Founded
-                        == datetime.date(1835, 9, 13)))
-             Biodome = list(session.query(Zoo).filter(Zoo.Name
--                           == u'Montr\xe9al Biod\xf4me'))
-+                           == 'Montr\xe9al Biod\xf4me'))
-             seaworld = list(session.query(Zoo).filter(Zoo.Admission
-                             == float(60)))
-
-             # Animals
-
-             leopard = list(session.query(Animal).filter(Animal.Species
--                           == u'Leopard'))
-+                           == 'Leopard'))
-             ostrich = list(session.query(Animal).filter(Animal.Species
--                           == u'Ostrich'))
-+                           == 'Ostrich'))
-             millipede = list(session.query(Animal).filter(Animal.Legs
-                              == 1000000))
-             ticks = list(session.query(Animal).filter(Animal.Species
--                         == u'Tick'))
-+                         == 'Tick'))
-
-     def test_baseline_4_expressions(self):
--        for x in xrange(ITERATIONS):
-+        for x in range(ITERATIONS):
-             assert len(list(session.query(Zoo))) == 5
-             assert len(list(session.query(Animal))) == ITERATIONS + 12
-             assert len(list(session.query(Animal).filter(Animal.Legs
-@@ -190,9 +190,9 @@
-             assert len(list(session.query(Animal).filter(Animal.Lifespan
-                        > 70))) == 2
-             assert len(list(session.query(Animal).
--                        filter(Animal.Species.like(u'L%')))) == 2
-+                        filter(Animal.Species.like('L%')))) == 2
-             assert len(list(session.query(Animal).
--                        filter(Animal.Species.like(u'%pede')))) == 2
-+                        filter(Animal.Species.like('%pede')))) == 2
-             assert len(list(session.query(Animal).filter(Animal.LastEscape
-                        != None))) == 1
-             assert len(list(session.query(Animal).filter(Animal.LastEscape
-@@ -201,29 +201,29 @@
-             # In operator (containedby)
-
-             assert len(list(session.query(Animal).filter(
--                    Animal.Species.like(u'%pede%')))) == 2
-+                    Animal.Species.like('%pede%')))) == 2
-             assert len(list(session.query(Animal).
--                    filter(Animal.Species.in_((u'Lion'
--                       , u'Tiger', u'Bear'))))) == 3
-+                    filter(Animal.Species.in_(('Lion'
-+                       , 'Tiger', 'Bear'))))) == 3
-
-             # Try In with cell references
-             class thing(object):
-                 pass
-
-             pet, pet2 = thing(), thing()
--            pet.Name, pet2.Name = u'Slug', u'Ostrich'
-+            pet.Name, pet2.Name = 'Slug', 'Ostrich'
-             assert len(list(session.query(Animal).
-                     filter(Animal.Species.in_((pet.Name,
-                        pet2.Name))))) == 2
-
-             # logic and other functions
-
--            name = u'Lion'
-+            name = 'Lion'
-             assert len(list(session.query(Animal).
-                     filter(func.length(Animal.Species)
-                        == len(name)))) == ITERATIONS + 3
-             assert len(list(session.query(Animal).
--                    filter(Animal.Species.like(u'%i%'
-+                    filter(Animal.Species.like('%i%'
-                        )))) == ITERATIONS + 7
-
-             # Test now(), today(), year(), month(), day()
-@@ -246,7 +246,7 @@
-
-         # TODO: convert to ORM
-         engine = metadata.bind
--        for x in xrange(ITERATIONS):
-+        for x in range(ITERATIONS):
-
-             # views
-
-@@ -270,7 +270,7 @@
-             for species, lifespan in engine.execute(select([Animal.c.Species,
-                     Animal.c.Lifespan])).fetchall():
-                 assert lifespan == expected[species]
--            expected = [u'Montr\xe9al Biod\xf4me', 'Wild Animal Park']
-+            expected = ['Montr\xe9al Biod\xf4me', 'Wild Animal Park']
-             e = select([Zoo.c.Name], and_(Zoo.c.Founded != None,
-                        Zoo.c.Founded <= func.current_timestamp(),
-                        Zoo.c.Founded >= datetime.date(1990, 1, 1)))
-@@ -284,13 +284,13 @@
-             legs.sort()
-
-     def test_baseline_6_editing(self):
--        for x in xrange(ITERATIONS):
-+        for x in range(ITERATIONS):
-
-             # Edit
-
--            SDZ = session.query(Zoo).filter(Zoo.Name == u'San Diego Zoo'
-+            SDZ = session.query(Zoo).filter(Zoo.Name == 'San Diego Zoo'
-                     ).one()
--            SDZ.Name = u'The San Diego Zoo'
-+            SDZ.Name = 'The San Diego Zoo'
-             SDZ.Founded = datetime.date(1900, 1, 1)
-             SDZ.Opens = datetime.time(7, 30, 0)
-             SDZ.Admission = 35.00
-@@ -298,19 +298,19 @@
-             # Test edits
-
-             SDZ = session.query(Zoo).filter(Zoo.Name
--                    == u'The San Diego Zoo').one()
-+                    == 'The San Diego Zoo').one()
-             assert SDZ.Founded == datetime.date(1900, 1, 1), SDZ.Founded
-
-             # Change it back
-
--            SDZ.Name = u'San Diego Zoo'
-+            SDZ.Name = 'San Diego Zoo'
-             SDZ.Founded = datetime.date(1835, 9, 13)
-             SDZ.Opens = datetime.time(9, 0, 0)
-             SDZ.Admission = 0
-
-             # Test re-edits
-
--            SDZ = session.query(Zoo).filter(Zoo.Name == u'San Diego Zoo'
-+            SDZ = session.query(Zoo).filter(Zoo.Name == 'San Diego Zoo'
-                     ).one()
-             assert SDZ.Founded == datetime.date(1835, 9, 13), \
-                 SDZ.Founded
-diff -r 9d0639b9d3be test/base/test_dependency.py
---- a/test/base/test_dependency.py     Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/base/test_dependency.py     Sat Apr 27 19:42:17 2013 -0400
-@@ -82,7 +82,7 @@
-         try:
-             list(topological.sort(tuples, allitems))
-             assert False
--        except exc.CircularDependencyError, err:
-+        except exc.CircularDependencyError as err:
-             eq_(err.cycles, set(['node1', 'node3', 'node2', 'node5',
-                 'node4']))
-             eq_(err.edges, set([('node3', 'node1'), ('node4', 'node1'),
-@@ -105,7 +105,7 @@
-         try:
-             list(topological.sort(tuples, allitems))
-             assert False
--        except exc.CircularDependencyError, err:
-+        except exc.CircularDependencyError as err:
-             eq_(err.cycles, set(['node1', 'node3', 'node2']))
-             eq_(err.edges, set([('node3', 'node1'), ('node2', 'node3'),
-                 ('node3', 'node2'), ('node1', 'node2'),
-@@ -271,7 +271,7 @@
-               ('node4', 'node17'), ('node2', 'node20'), ('node19', 'node10'),
-               ('node8', 'node4'), ('node11', 'node3'), ('node6', 'node1')
-         ]
--        allnodes = ['node%d' % i for i in xrange(1, 21)]
-+        allnodes = ['node%d' % i for i in range(1, 21)]
-         eq_(
-             topological.find_cycles(tuples, allnodes),
-             set(['node11', 'node10', 'node13', 'node15', 'node14', 'node17',
-diff -r 9d0639b9d3be test/base/test_events.py
---- a/test/base/test_events.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/base/test_events.py Sat Apr 27 19:42:17 2013 -0400
-@@ -190,7 +190,7 @@
-     def test_lis_subcalss_lis(self):
-         @event.listens_for(self.TargetOne, "event_one")
-         def handler1(x, y):
--            print 'handler1'
-+            print('handler1')
-
-         class SubTarget(self.TargetOne):
-             pass
-@@ -207,7 +207,7 @@
-     def test_lis_multisub_lis(self):
-         @event.listens_for(self.TargetOne, "event_one")
-         def handler1(x, y):
--            print 'handler1'
-+            print('handler1')
-
-         class SubTarget(self.TargetOne):
-             pass
-diff -r 9d0639b9d3be test/base/test_except.py
---- a/test/base/test_except.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/base/test_except.py Sat Apr 27 19:42:17 2013 -0400
-@@ -5,14 +5,15 @@
- from sqlalchemy.testing import fixtures
- from sqlalchemy.testing import eq_
-
--# Py3K
--#StandardError = BaseException
--# Py2K
--from exceptions import StandardError, KeyboardInterrupt, SystemExit
-+# start Py3K
-+Exception = BaseException
-+# end Py3K
-+# start Py2K
-+#from exceptions import StandardError, KeyboardInterrupt, SystemExit
- # end Py2K
-
-
--class Error(StandardError):
-+class Error(Exception):
-     """This class will be old-style on <= 2.4 and new-style on >=
-     2.5."""
-
-@@ -47,7 +48,7 @@
-         try:
-             raise sa_exceptions.DBAPIError.instance('this is a message'
-                     , None, OperationalError(), DatabaseError)
--        except sa_exceptions.DBAPIError, exc:
-+        except sa_exceptions.DBAPIError as exc:
-             assert str(exc) \
-                 == "(OperationalError)  'this is a message' None"
-
-@@ -58,7 +59,7 @@
-                 {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h':
-                 8, 'i': 9, 'j': 10, 'k': 11,
-                 }, OperationalError(), DatabaseError)
--        except sa_exceptions.DBAPIError, exc:
-+        except sa_exceptions.DBAPIError as exc:
-             assert str(exc).startswith("(OperationalError)  'this is a "
-                     "message' {")
-
-@@ -67,7 +68,7 @@
-             raise sa_exceptions.DBAPIError.instance('this is a message',
-                 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,],
-                 OperationalError(), DatabaseError)
--        except sa_exceptions.DBAPIError, exc:
-+        except sa_exceptions.DBAPIError as exc:
-             assert str(exc).startswith("(OperationalError)  'this is a "
-                     "message' [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]")
-
-@@ -77,7 +78,7 @@
-                 [{1: 1}, {1: 1}, {1: 1}, {1: 1}, {1: 1}, {1: 1},
-                 {1: 1}, {1:1}, {1: 1}, {1: 1},],
-                 OperationalError(), DatabaseError)
--        except sa_exceptions.DBAPIError, exc:
-+        except sa_exceptions.DBAPIError as exc:
-             eq_(str(exc) ,
-                 "(OperationalError)  'this is a message' [{1: 1}, "\
-                 "{1: 1}, {1: 1}, {1: 1}, {1: 1}, {1: 1}, {1: 1}, {1: "\
-@@ -87,7 +88,7 @@
-                 {1: 1}, {1: 1}, {1: 1}, {1: 1}, {1: 1}, {1: 1}, {1: 1},
-                 {1:1}, {1: 1}, {1: 1}, {1: 1},
-                 ], OperationalError(), DatabaseError)
--        except sa_exceptions.DBAPIError, exc:
-+        except sa_exceptions.DBAPIError as exc:
-             eq_(str(exc) ,
-                 "(OperationalError)  'this is a message' [{1: 1}, "
-                 "{1: 1}, {1: 1}, {1: 1}, {1: 1}, {1: 1}, "
-@@ -100,7 +101,7 @@
-                 (1, ), (1, ), (1, ), (1, ), (1, ), (1, ), (1, ), (1, ), (1, ),
-                 (1, ),
-                 ], OperationalError(), DatabaseError)
--        except sa_exceptions.DBAPIError, exc:
-+        except sa_exceptions.DBAPIError as exc:
-             eq_(str(exc),
-                 "(OperationalError)  'this is a message' [(1,), "\
-                 "(1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,)]")
-@@ -109,7 +110,7 @@
-                 (1, ), (1, ), (1, ), (1, ), (1, ), (1, ), (1, ), (1, ), (1, ),
-                 (1, ), (1, ),
-                 ], OperationalError(), DatabaseError)
--        except sa_exceptions.DBAPIError, exc:
-+        except sa_exceptions.DBAPIError as exc:
-             eq_(str(exc),
-                 "(OperationalError)  'this is a message' [(1,), "
-                 "(1,), (1,), (1,), (1,), (1,), (1,), (1,)  "
-@@ -121,7 +122,7 @@
-         try:
-             raise sa_exceptions.DBAPIError.instance('', [],
-                     ProgrammingError(), DatabaseError)
--        except sa_exceptions.DBAPIError, e:
-+        except sa_exceptions.DBAPIError as e:
-             self.assert_(True)
-             self.assert_('Error in str() of DB-API' in e.args[0])
-
-@@ -129,7 +130,7 @@
-         try:
-             raise sa_exceptions.DBAPIError.instance('', [], OutOfSpec(),
-                         DatabaseError)
--        except sa_exceptions.DBAPIError, e:
-+        except sa_exceptions.DBAPIError as e:
-             self.assert_(e.__class__ is sa_exceptions.DBAPIError)
-         except OutOfSpec:
-             self.assert_(False)
-@@ -137,7 +138,7 @@
-         try:
-             raise sa_exceptions.DBAPIError.instance('', [],
-                     sa_exceptions.ArgumentError(), DatabaseError)
--        except sa_exceptions.DBAPIError, e:
-+        except sa_exceptions.DBAPIError as e:
-             self.assert_(e.__class__ is sa_exceptions.DBAPIError)
-         except sa_exceptions.ArgumentError:
-             self.assert_(False)
-diff -r 9d0639b9d3be test/base/test_utils.py
---- a/test/base/test_utils.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/base/test_utils.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -16,7 +16,7 @@
-         eq_(len(keyed_tuple), 0)
-
-         eq_(keyed_tuple.__dict__, {'_labels': []})
--        eq_(keyed_tuple.keys(), [])
-+        eq_(list(keyed_tuple.keys()), [])
-         eq_(keyed_tuple._fields, ())
-         eq_(keyed_tuple._asdict(), {})
-
-@@ -27,7 +27,7 @@
-         eq_(len(keyed_tuple), 2)
-
-         eq_(keyed_tuple.__dict__, {'_labels': []})
--        eq_(keyed_tuple.keys(), [])
-+        eq_(list(keyed_tuple.keys()), [])
-         eq_(keyed_tuple._fields, ())
-         eq_(keyed_tuple._asdict(), {})
-
-@@ -37,7 +37,7 @@
-     def test_basic_creation(self):
-         keyed_tuple = util.KeyedTuple([1, 2], ['a', 'b'])
-         eq_(str(keyed_tuple), '(1, 2)')
--        eq_(keyed_tuple.keys(), ['a', 'b'])
-+        eq_(list(keyed_tuple.keys()), ['a', 'b'])
-         eq_(keyed_tuple._fields, ('a', 'b'))
-         eq_(keyed_tuple._asdict(), {'a': 1, 'b': 2})
-
-@@ -66,7 +66,7 @@
-         # TODO: consider not allowing None labels
-         expected = {'a': 1, None: 2, 'b': 3, '_labels': ['a', None, 'b']}
-         eq_(keyed_tuple.__dict__, expected)
--        eq_(keyed_tuple.keys(), ['a', 'b'])
-+        eq_(list(keyed_tuple.keys()), ['a', 'b'])
-         eq_(keyed_tuple._fields, ('a', 'b'))
-         eq_(keyed_tuple._asdict(), {'a': 1, 'b': 3})
-
-@@ -86,7 +86,7 @@
-         # TODO: consider not allowing duplicate labels
-         expected = {'a': 1, 'b': 3, '_labels': ['a', 'b', 'b']}
-         eq_(keyed_tuple.__dict__, expected)
--        eq_(keyed_tuple.keys(), ['a', 'b', 'b'])
-+        eq_(list(keyed_tuple.keys()), ['a', 'b', 'b'])
-         eq_(keyed_tuple._fields, ('a', 'b', 'b'))
-         eq_(keyed_tuple._asdict(), {'a': 1, 'b': 3})
-
-@@ -125,12 +125,12 @@
-         o['snack'] = 'attack'
-         o['c'] = 3
-
--        eq_(o.keys(), ['a', 'b', 'snack', 'c'])
--        eq_(o.values(), [1, 2, 'attack', 3])
-+        eq_(list(o.keys()), ['a', 'b', 'snack', 'c'])
-+        eq_(list(o.values()), [1, 2, 'attack', 3])
-
-         o.pop('snack')
--        eq_(o.keys(), ['a', 'b', 'c'])
--        eq_(o.values(), [1, 2, 3])
-+        eq_(list(o.keys()), ['a', 'b', 'c'])
-+        eq_(list(o.values()), [1, 2, 3])
-
-         try:
-             o.pop('eep')
-@@ -146,40 +146,40 @@
-         except TypeError:
-             pass
-
--        eq_(o.keys(), ['a', 'b', 'c'])
--        eq_(o.values(), [1, 2, 3])
-+        eq_(list(o.keys()), ['a', 'b', 'c'])
-+        eq_(list(o.values()), [1, 2, 3])
-
-         o2 = util.OrderedDict(d=4)
-         o2['e'] = 5
-
--        eq_(o2.keys(), ['d', 'e'])
--        eq_(o2.values(), [4, 5])
-+        eq_(list(o2.keys()), ['d', 'e'])
-+        eq_(list(o2.values()), [4, 5])
-
-         o.update(o2)
--        eq_(o.keys(), ['a', 'b', 'c', 'd', 'e'])
--        eq_(o.values(), [1, 2, 3, 4, 5])
-+        eq_(list(o.keys()), ['a', 'b', 'c', 'd', 'e'])
-+        eq_(list(o.values()), [1, 2, 3, 4, 5])
-
-         o.setdefault('c', 'zzz')
-         o.setdefault('f', 6)
--        eq_(o.keys(), ['a', 'b', 'c', 'd', 'e', 'f'])
--        eq_(o.values(), [1, 2, 3, 4, 5, 6])
-+        eq_(list(o.keys()), ['a', 'b', 'c', 'd', 'e', 'f'])
-+        eq_(list(o.values()), [1, 2, 3, 4, 5, 6])
-
-     def test_odict_constructor(self):
-         o = util.OrderedDict([('name', 'jbe'), ('fullname', 'jonathan'
-                              ), ('password', '')])
--        eq_(o.keys(), ['name', 'fullname', 'password'])
-+        eq_(list(o.keys()), ['name', 'fullname', 'password'])
-
-     def test_odict_copy(self):
-         o = util.OrderedDict()
-         o["zzz"] = 1
-         o["aaa"] = 2
--        eq_(o.keys(), ['zzz', 'aaa'])
-+        eq_(list(o.keys()), ['zzz', 'aaa'])
-
-         o2 = o.copy()
--        eq_(o2.keys(), o.keys())
-+        eq_(list(o2.keys()), list(o.keys()))
-
-         o3 = copy.copy(o)
--        eq_(o3.keys(), o.keys())
-+        eq_(list(o3.keys()), list(o.keys()))
-
-
- class OrderedSetTest(fixtures.TestBase):
-@@ -198,7 +198,7 @@
-     def test_serialize(self):
-         d = util.immutabledict({1: 2, 3: 4})
-         for loads, dumps in picklers():
--            print loads(dumps(d))
-+            print(loads(dumps(d)))
-
-
- class MemoizedAttrTest(fixtures.TestBase):
-@@ -252,7 +252,7 @@
-         try:
-             cc['col1'] in cc
-             assert False
--        except exc.ArgumentError, e:
-+        except exc.ArgumentError as e:
-             eq_(str(e), "__contains__ requires a string argument")
-
-     def test_compare(self):
-@@ -414,14 +414,14 @@
-         for type_ in (object, ImmutableSubclass):
-             data = [type_(), type_()]
-             ids = util.IdentitySet()
--            for i in range(2) + range(2):
-+            for i in list(range(2)) + list(range(2)):
-                 ids.add(data[i])
-             self.assert_eq(ids, data)
-
-         for type_ in (EqOverride, HashOverride, HashEqOverride):
-             data = [type_(1), type_(1), type_(2)]
-             ids = util.IdentitySet()
--            for i in range(3) + range(3):
-+            for i in list(range(3)) + list(range(3)):
-                 ids.add(data[i])
-             self.assert_eq(ids, data)
-
-@@ -843,13 +843,14 @@
-         return super_, sub_, twin1, twin2, unique1, unique2
-
-     def _assert_unorderable_types(self, callable_):
--        # Py3K
--        #assert_raises_message(
--        #    TypeError, 'unorderable types', callable_)
--        # Py2K
-+# start Py3K
-         assert_raises_message(
--            TypeError, 'cannot compare sets using cmp()', callable_)
--        # end Py2K
-+            TypeError, 'unorderable types', callable_)
-+# end Py3K
-+# start Py2K
-+#        assert_raises_message(
-+#            TypeError, 'cannot compare sets using cmp()', callable_)
-+# end Py2K
-
-     def test_basic_sanity(self):
-         IdentitySet = util.IdentitySet
-@@ -969,23 +970,23 @@
-         d = subdict(a=1, b=2, c=3)
-         self._ok(d)
-
--    # Py2K
--    def test_UserDict(self):
--        import UserDict
--        d = UserDict.UserDict(a=1, b=2, c=3)
--        self._ok(d)
--    # end Py2K
-+# start Py2K
-+#    def test_UserDict(self):
-+#        import UserDict
-+#        d = UserDict.UserDict(a=1, b=2, c=3)
-+#        self._ok(d)
-+# end Py2K
-
-     def test_object(self):
-         self._notok(object())
-
--    # Py2K
--    def test_duck_1(self):
--        class duck1(object):
--            def iteritems(duck):
--                return iter(self.baseline)
--        self._ok(duck1())
--    # end Py2K
-+# start Py2K
-+#    def test_duck_1(self):
-+#        class duck1(object):
-+#            def iteritems(duck):
-+#                return iter(self.baseline)
-+#        self._ok(duck1())
-+# end Py2K
-
-     def test_duck_2(self):
-         class duck2(object):
-@@ -993,16 +994,16 @@
-                 return list(self.baseline)
-         self._ok(duck2())
-
--    # Py2K
--    def test_duck_3(self):
--        class duck3(object):
--            def iterkeys(duck):
--                return iter(['a', 'b', 'c'])
--
--            def __getitem__(duck, key):
--                return dict(a=1, b=2, c=3).get(key)
--        self._ok(duck3())
--    # end Py2K
-+# start Py2K
-+#    def test_duck_3(self):
-+#        class duck3(object):
-+#            def iterkeys(duck):
-+#                return iter(['a', 'b', 'c'])
-+#
-+#            def __getitem__(duck, key):
-+#                return dict(a=1, b=2, c=3).get(key)
-+#        self._ok(duck3())
-+# end Py2K
-
-     def test_duck_4(self):
-         class duck4(object):
-@@ -1029,9 +1030,9 @@
- class DuckTypeCollectionTest(fixtures.TestBase):
-
-     def test_sets(self):
--        # Py2K
--        import sets
--        # end Py2K
-+# start Py2K
-+#        import sets
-+# end Py2K
-
-         class SetLike(object):
-             def add(self):
-@@ -1041,9 +1042,9 @@
-             __emulates__ = set
-
-         for type_ in (set,
--                      # Py2K
--                      sets.Set,
--                      # end Py2K
-+# start Py2K
-+#                      sets.Set,
-+# end Py2K
-                       SetLike,
-                       ForcedSet):
-             eq_(util.duck_type_collection(type_), set)
-@@ -1051,9 +1052,9 @@
-             eq_(util.duck_type_collection(instance), set)
-
-         for type_ in (frozenset,
--                      # Py2K
--                      sets.ImmutableSet
--                      # end Py2K
-+# start Py2K
-+#                      sets.ImmutableSet
-+# end Py2K
-                       ):
-             is_(util.duck_type_collection(type_), None)
-             instance = type_()
-@@ -1175,7 +1176,7 @@
-         sym3 = util.pickle.loads(s)
-
-         for protocol in 0, 1, 2:
--            print protocol
-+            print(protocol)
-             serial = util.pickle.dumps(sym1)
-             rt = util.pickle.loads(serial)
-             assert rt is sym1
-@@ -1550,21 +1551,21 @@
-         eq_(set(util.class_hierarchy(A)), set((A, B, C, object)))
-         eq_(set(util.class_hierarchy(B)), set((A, B, C, object)))
-
--    # Py2K
--    def test_oldstyle_mixin(self):
--        class A(object):
--            pass
--
--        class Mixin:
--            pass
--
--        class B(A, Mixin):
--            pass
--
--        eq_(set(util.class_hierarchy(B)), set((A, B, object)))
--        eq_(set(util.class_hierarchy(Mixin)), set())
--        eq_(set(util.class_hierarchy(A)), set((A, B, object)))
--    # end Py2K
-+# start Py2K
-+#    def test_oldstyle_mixin(self):
-+#        class A(object):
-+#            pass
-+#
-+#        class Mixin:
-+#            pass
-+#
-+#        class B(A, Mixin):
-+#            pass
-+#
-+#        eq_(set(util.class_hierarchy(B)), set((A, B, object)))
-+#        eq_(set(util.class_hierarchy(Mixin)), set())
-+#        eq_(set(util.class_hierarchy(A)), set((A, B, object)))
-+# end Py2K
-
-
- class TestClassProperty(fixtures.TestBase):
-diff -r 9d0639b9d3be test/dialect/test_firebird.py
---- a/test/dialect/test_firebird.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/dialect/test_firebird.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -28,7 +28,7 @@
-                         )
-             con.execute('CREATE DOMAIN img_domain AS BLOB SUB_TYPE '
-                         'BINARY')
--        except ProgrammingError, e:
-+        except ProgrammingError as e:
-             if not 'attempt to store duplicate value' in str(e):
-                 raise e
-         con.execute('''CREATE GENERATOR gen_testtable_id''')
-diff -r 9d0639b9d3be test/dialect/test_mssql.py
---- a/test/dialect/test_mssql.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/dialect/test_mssql.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -403,7 +403,7 @@
-         self.assert_compile(
-             s,
-             "SELECT TOP 10 t.x, t.y FROM t WHERE t.x = :x_1 ORDER BY t.y",
--            checkparams={u'x_1': 5}
-+            checkparams={'x_1': 5}
-         )
-
-     def test_limit_zero_using_top(self):
-@@ -414,7 +414,7 @@
-         self.assert_compile(
-             s,
-             "SELECT TOP 0 t.x, t.y FROM t WHERE t.x = :x_1 ORDER BY t.y",
--            checkparams={u'x_1': 5}
-+            checkparams={'x_1': 5}
-         )
-
-     def test_offset_using_window(self):
-@@ -424,14 +424,14 @@
-
-         # test that the select is not altered with subsequent compile
-         # calls
--        for i in xrange(2):
-+        for i in range(2):
-             self.assert_compile(
-                 s,
-                 "SELECT anon_1.x, anon_1.y FROM (SELECT t.x AS x, t.y "
-                 "AS y, ROW_NUMBER() OVER (ORDER BY t.y) AS "
-                 "mssql_rn FROM t WHERE t.x = :x_1) AS "
-                 "anon_1 WHERE mssql_rn > :mssql_rn_1",
--                checkparams={u'mssql_rn_1': 20, u'x_1': 5}
-+                checkparams={'mssql_rn_1': 20, 'x_1': 5}
-             )
-
-     def test_limit_offset_using_window(self):
-@@ -447,7 +447,7 @@
-             "FROM t "
-             "WHERE t.x = :x_1) AS anon_1 "
-             "WHERE mssql_rn > :mssql_rn_1 AND mssql_rn <= :mssql_rn_2",
--            checkparams={u'mssql_rn_1': 20, u'mssql_rn_2': 30, u'x_1': 5}
-+            checkparams={'mssql_rn_1': 20, 'mssql_rn_2': 30, 'x_1': 5}
-         )
-
-     def test_limit_offset_with_correlated_order_by(self):
-@@ -468,7 +468,7 @@
-             "FROM t1 "
-             "WHERE t1.x = :x_1) AS anon_1 "
-             "WHERE mssql_rn > :mssql_rn_1 AND mssql_rn <= :mssql_rn_2",
--            checkparams={u'mssql_rn_1': 20, u'mssql_rn_2': 30, u'x_1': 5}
-+            checkparams={'mssql_rn_1': 20, 'mssql_rn_2': 30, 'x_1': 5}
-         )
-
-     def test_limit_zero_offset_using_window(self):
-@@ -482,7 +482,7 @@
-             s,
-             "SELECT TOP 0 t.x, t.y FROM t "
-             "WHERE t.x = :x_1 ORDER BY t.y",
--            checkparams={u'x_1': 5}
-+            checkparams={'x_1': 5}
-         )
-
-     def test_sequence_start_0(self):
-@@ -851,11 +851,11 @@
-         # encode in UTF-8 (sting object) because this is the default
-         # dialect encoding
-
--        con.execute(u"insert into unitest_table values ('bien u\
-+        con.execute("insert into unitest_table values ('bien u\
-                     umang\xc3\xa9')".encode('UTF-8'))
-         try:
-             r = t1.select().execute().first()
--            assert isinstance(r[1], unicode), \
-+            assert isinstance(r[1], str), \
-                 '%s is %s instead of unicode, working on %s' % (r[1],
-                     type(r[1]), meta.bind)
-         finally:
-@@ -1707,7 +1707,7 @@
-                 )]
-             for value in test_items:
-                 float_table.insert().execute(floatcol=value)
--        except Exception, e:
-+        except Exception as e:
-             raise e
-
-
-@@ -1953,8 +1953,8 @@
-
-     def test_unicode(self):
-         module = __import__('pymssql')
--        result = module.Binary(u'foo')
--        eq_(result, u'foo')
-+        result = module.Binary('foo')
-+        eq_(result, 'foo')
-
-     def test_bytes(self):
-         module = __import__('pymssql')
-@@ -2073,7 +2073,7 @@
-
-         dialect = mssql.dialect()
-         value = CoerceUnicode().bind_processor(dialect)('a string')
--        assert isinstance(value, unicode)
-+        assert isinstance(value, str)
-
- class ReflectHugeViewTest(fixtures.TestBase):
-     __only_on__ = 'mssql'
-@@ -2085,13 +2085,13 @@
-         t = Table('base_table', self.metadata,
-                 *[
-                     Column("long_named_column_number_%d" % i, Integer)
--                    for i in xrange(self.col_num)
-+                    for i in range(self.col_num)
-                 ]
-         )
-         self.view_str = view_str = \
-             "CREATE VIEW huge_named_view AS SELECT %s FROM base_table" % (
-             ",".join("long_named_column_number_%d" % i
--                        for i in xrange(self.col_num))
-+                        for i in range(self.col_num))
-             )
-         assert len(view_str) > 4000
-
-diff -r 9d0639b9d3be test/dialect/test_mysql.py
---- a/test/dialect/test_mysql.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/dialect/test_mysql.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -372,9 +372,9 @@
-                 try:
-                     self.assert_(list(row) == expected)
-                 except:
--                    print "Storing %s" % store
--                    print "Expected %s" % expected
--                    print "Found %s" % list(row)
-+                    print("Storing %s" % store)
-+                    print("Expected %s" % expected)
-+                    print("Found %s" % list(row))
-                     raise
-                 table.delete().execute().close()
-
-@@ -684,17 +684,17 @@
-         metadata = MetaData(unicode_engine)
-         t1 = Table('table', metadata,
-             Column('id', Integer, primary_key=True),
--            Column('value', Enum(u'réveillé', u'drôle', u'S’il')),
--            Column('value2', mysql.ENUM(u'réveillé', u'drôle', u'S’il'))
-+            Column('value', Enum('réveillé', 'drôle', 'S’il')),
-+            Column('value2', mysql.ENUM('réveillé', 'drôle', 'S’il'))
-         )
-         metadata.create_all()
-         try:
--            t1.insert().execute(value=u'drôle', value2=u'drôle')
--            t1.insert().execute(value=u'réveillé', value2=u'réveillé')
--            t1.insert().execute(value=u'S’il', value2=u'S’il')
-+            t1.insert().execute(value='drôle', value2='drôle')
-+            t1.insert().execute(value='réveillé', value2='réveillé')
-+            t1.insert().execute(value='S’il', value2='S’il')
-             eq_(t1.select().order_by(t1.c.id).execute().fetchall(),
--                [(1, u'drôle', u'drôle'), (2, u'réveillé', u'réveillé'),
--                            (3, u'S’il', u'S’il')]
-+                [(1, 'drôle', 'drôle'), (2, 'réveillé', 'réveillé'),
-+                            (3, 'S’il', 'S’il')]
-             )
-
-             # test reflection of the enum labels
-@@ -706,10 +706,10 @@
-             # latin-1 stuff forcing its way in ?
-
-             assert t2.c.value.type.enums[0:2] == \
--                    (u'réveillé', u'drôle')  # u'S’il') # eh ?
-+                    ('réveillé', 'drôle')  # u'S’il') # eh ?
-
-             assert t2.c.value2.type.enums[0:2] == \
--                    (u'réveillé', u'drôle')  # u'S’il') # eh ?
-+                    ('réveillé', 'drôle')  # u'S’il') # eh ?
-         finally:
-             metadata.drop_all()
-
-@@ -877,13 +877,13 @@
-             reflected = Table('mysql_case', MetaData(testing.db),
-                               autoload=True, include_columns=['c1', 'C2'])
-             for t in case_table, reflected:
--                assert 'c1' in t.c.keys()
--                assert 'C2' in t.c.keys()
-+                assert 'c1' in list(t.c.keys())
-+                assert 'C2' in list(t.c.keys())
-             reflected2 = Table('mysql_case', MetaData(testing.db),
-                               autoload=True, include_columns=['c1', 'c2'])
--            assert 'c1' in reflected2.c.keys()
-+            assert 'c1' in list(reflected2.c.keys())
-             for c in ['c2', 'C2', 'C3']:
--                assert c not in reflected2.c.keys()
-+                assert c not in list(reflected2.c.keys())
-         finally:
-             case_table.drop()
-
-@@ -1370,7 +1370,7 @@
-     def _options(self, modes):
-         def connect(con, record):
-             cursor = con.cursor()
--            print "DOING THiS:", "set sql_mode='%s'" % (",".join(modes))
-+            print("DOING THiS:", "set sql_mode='%s'" % (",".join(modes)))
-             cursor.execute("set sql_mode='%s'" % (",".join(modes)))
-         e = engines.testing_engine(options={
-             'pool_events':[
-diff -r 9d0639b9d3be test/dialect/test_oracle.py
---- a/test/dialect/test_oracle.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/dialect/test_oracle.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -1,5 +1,5 @@
- # coding: utf-8
--from __future__ import with_statement
-+
-
- from sqlalchemy.testing import eq_
- from sqlalchemy import *
-@@ -807,7 +807,7 @@
-         )
-     def test_twophase_prepare_false(self):
-         conn = self._connection()
--        for i in xrange(2):
-+        for i in range(2):
-             trans = conn.begin_twophase()
-             conn.execute("select 1 from dual")
-             trans.prepare()
-@@ -817,7 +817,7 @@
-
-     def test_twophase_prepare_true(self):
-         conn = self._connection()
--        for i in xrange(2):
-+        for i in range(2):
-             trans = conn.begin_twophase()
-             conn.execute("insert into datatable (id, data) "
-                     "values (%s, 'somedata')" % i)
-@@ -870,7 +870,7 @@
-         b = bindparam("foo", "hello world!")
-         assert b.type.dialect_impl(dialect).get_dbapi_type(dbapi) == 'STRING'
-
--        b = bindparam("foo", u"hello world!")
-+        b = bindparam("foo", "hello world!")
-         assert b.type.dialect_impl(dialect).get_dbapi_type(dbapi) == 'STRING'
-
-     def test_long(self):
-@@ -1257,7 +1257,7 @@
-             autoload=True, oracle_resolve_synonyms=True
-             )
-         for row in types_table.select().execute().fetchall():
--            [row[k] for k in row.keys()]
-+            [row[k] for k in list(row.keys())]
-
-     @testing.provide_metadata
-     def test_raw_roundtrip(self):
-@@ -1291,11 +1291,11 @@
-                 t2.c.data.type.dialect_impl(testing.db.dialect),
-                 cx_oracle._OracleNVarChar)
-
--        data = u'm’a réveillé.'
-+        data = 'm’a réveillé.'
-         t2.insert().execute(data=data)
-         res = t2.select().execute().first()['data']
-         eq_(res, data)
--        assert isinstance(res, unicode)
-+        assert isinstance(res, str)
-
-
-     def test_char_length(self):
-@@ -1426,7 +1426,7 @@
-         m = MetaData(testing.db)
-         m.reflect()
-         eq_(
--            set(t.name for t in m.tables.values()),
-+            set(t.name for t in list(m.tables.values())),
-             set(['admin_docindex'])
-         )
-
-@@ -1641,28 +1641,28 @@
-         metadata.create_all()
-
-         table.insert().execute(
--            {'_underscorecolumn': u'’é'},
-+            {'_underscorecolumn': '’é'},
-         )
-         result = testing.db.execute(
--            table.select().where(table.c._underscorecolumn==u'’é')
-+            table.select().where(table.c._underscorecolumn=='’é')
-         ).scalar()
--        eq_(result, u'’é')
-+        eq_(result, '’é')
-
-     @testing.provide_metadata
-     def test_quoted_column_unicode(self):
-         metadata = self.metadata
-         table=Table("atable", metadata,
--            Column(u"méil", Unicode(255), primary_key=True),
-+            Column("méil", Unicode(255), primary_key=True),
-         )
-         metadata.create_all()
-
-         table.insert().execute(
--            {u'méil': u'’é'},
-+            {'méil': '’é'},
-         )
-         result = testing.db.execute(
--            table.select().where(table.c[u'méil']==u'’é')
-+            table.select().where(table.c['méil']=='’é')
-         ).scalar()
--        eq_(result, u'’é')
-+        eq_(result, '’é')
-
-
- class DBLinkReflectionTest(fixtures.TestBase):
-@@ -1702,5 +1702,5 @@
-
-         t = Table('test_table_syn', m, autoload=True,
-                 autoload_with=testing.db, oracle_resolve_synonyms=True)
--        eq_(t.c.keys(), ['id', 'data'])
-+        eq_(list(t.c.keys()), ['id', 'data'])
-         eq_(list(t.primary_key), [t.c.id])
-diff -r 9d0639b9d3be test/dialect/test_postgresql.py
---- a/test/dialect/test_postgresql.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/dialect/test_postgresql.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -1,6 +1,6 @@
- # coding: utf-8
-
--from __future__ import with_statement
-+
-
- from sqlalchemy.testing.assertions import eq_, assert_raises, \
-                 assert_raises_message, is_, AssertsExecutionResults, \
-@@ -559,21 +559,21 @@
-         t1 = Table('table', metadata,
-             Column('id', Integer, primary_key=True),
-             Column('value',
--                    Enum(u'réveillé', u'drôle', u'S’il',
-+                    Enum('réveillé', 'drôle', 'S’il',
-                             name='onetwothreetype'))
-         )
-
-         metadata.create_all()
-         try:
--            t1.insert().execute(value=u'drôle')
--            t1.insert().execute(value=u'réveillé')
--            t1.insert().execute(value=u'S’il')
-+            t1.insert().execute(value='drôle')
-+            t1.insert().execute(value='réveillé')
-+            t1.insert().execute(value='S’il')
-             eq_(t1.select().order_by(t1.c.id).execute().fetchall(),
--                [(1, u'drôle'), (2, u'réveillé'), (3, u'S’il')]
-+                [(1, 'drôle'), (2, 'réveillé'), (3, 'S’il')]
-             )
-             m2 = MetaData(testing.db)
-             t2 = Table('table', m2, autoload=True)
--            assert t2.c.value.type.enums == (u'réveillé', u'drôle', u'S’il')
-+            assert t2.c.value.type.enums == ('réveillé', 'drôle', 'S’il')
-         finally:
-             metadata.drop_all()
-
-@@ -1238,7 +1238,7 @@
-             :
-             try:
-                 con.execute(ddl)
--            except exc.DBAPIError, e:
-+            except exc.DBAPIError as e:
-                 if not 'already exists' in str(e):
-                     raise e
-         con.execute('CREATE TABLE testtable (question integer, answer '
-@@ -1476,7 +1476,7 @@
-         meta1.create_all()
-         meta2 = MetaData(testing.db)
-         subject = Table('subject', meta2, autoload=True)
--        eq_(subject.primary_key.columns.keys(), [u'p2', u'p1'])
-+        eq_(list(subject.primary_key.columns.keys()), ['p2', 'p1'])
-
-     @testing.provide_metadata
-     def test_pg_weirdchar_reflection(self):
-@@ -1749,7 +1749,7 @@
-         conn.execute("ALTER TABLE t RENAME COLUMN x to y")
-
-         ind = testing.db.dialect.get_indexes(conn, "t", None)
--        eq_(ind, [{'unique': False, 'column_names': [u'y'], 'name': u'idx1'}])
-+        eq_(ind, [{'unique': False, 'column_names': ['y'], 'name': 'idx1'}])
-         conn.close()
-
- class CustomTypeReflectionTest(fixtures.TestBase):
-@@ -2174,8 +2174,8 @@
-
-     def test_insert_array(self):
-         arrtable = self.tables.arrtable
--        arrtable.insert().execute(intarr=[1, 2, 3], strarr=[u'abc',
--                                  u'def'])
-+        arrtable.insert().execute(intarr=[1, 2, 3], strarr=['abc',
-+                                  'def'])
-         results = arrtable.select().execute().fetchall()
-         eq_(len(results), 1)
-         eq_(results[0]['intarr'], [1, 2, 3])
-@@ -2183,9 +2183,9 @@
-
-     def test_array_where(self):
-         arrtable = self.tables.arrtable
--        arrtable.insert().execute(intarr=[1, 2, 3], strarr=[u'abc',
--                                  u'def'])
--        arrtable.insert().execute(intarr=[4, 5, 6], strarr=u'ABC')
-+        arrtable.insert().execute(intarr=[1, 2, 3], strarr=['abc',
-+                                  'def'])
-+        arrtable.insert().execute(intarr=[4, 5, 6], strarr='ABC')
-         results = arrtable.select().where(arrtable.c.intarr == [1, 2,
-                 3]).execute().fetchall()
-         eq_(len(results), 1)
-@@ -2194,7 +2194,7 @@
-     def test_array_concat(self):
-         arrtable = self.tables.arrtable
-         arrtable.insert().execute(intarr=[1, 2, 3],
--                    strarr=[u'abc', u'def'])
-+                    strarr=['abc', 'def'])
-         results = select([arrtable.c.intarr + [4, 5,
-                          6]]).execute().fetchall()
-         eq_(len(results), 1)
-@@ -2203,15 +2203,15 @@
-     def test_array_subtype_resultprocessor(self):
-         arrtable = self.tables.arrtable
-         arrtable.insert().execute(intarr=[4, 5, 6],
--                                  strarr=[[u'm\xe4\xe4'], [u'm\xf6\xf6'
-+                                  strarr=[['m\xe4\xe4'], ['m\xf6\xf6'
-                                   ]])
--        arrtable.insert().execute(intarr=[1, 2, 3], strarr=[u'm\xe4\xe4'
--                                  , u'm\xf6\xf6'])
-+        arrtable.insert().execute(intarr=[1, 2, 3], strarr=['m\xe4\xe4'
-+                                  , 'm\xf6\xf6'])
-         results = \
-             arrtable.select(order_by=[arrtable.c.intarr]).execute().fetchall()
-         eq_(len(results), 2)
--        eq_(results[0]['strarr'], [u'm\xe4\xe4', u'm\xf6\xf6'])
--        eq_(results[1]['strarr'], [[u'm\xe4\xe4'], [u'm\xf6\xf6']])
-+        eq_(results[0]['strarr'], ['m\xe4\xe4', 'm\xf6\xf6'])
-+        eq_(results[1]['strarr'], [['m\xe4\xe4'], ['m\xf6\xf6']])
-
-     def test_array_literal(self):
-         eq_(
-@@ -2263,7 +2263,7 @@
-         testing.db.execute(
-             arrtable.insert(),
-             intarr=[4, 5, 6],
--            strarr=[u'abc', u'def']
-+            strarr=['abc', 'def']
-         )
-         eq_(
-             testing.db.scalar(select([arrtable.c.intarr[2:3]])),
-diff -r 9d0639b9d3be test/dialect/test_sqlite.py
---- a/test/dialect/test_sqlite.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/dialect/test_sqlite.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -84,7 +84,7 @@
-             eq_(row, (1, datetime.date(2010, 5, 10),
-             datetime.datetime( 2010, 5, 10, 12, 15, 25, )))
-             r = engine.execute(func.current_date()).scalar()
--            assert isinstance(r, basestring)
-+            assert isinstance(r, str)
-         finally:
-             t.drop(engine)
-             engine.dispose()
-@@ -104,8 +104,8 @@
-             UnicodeText(),
-             ):
-             bindproc = t.dialect_impl(dialect).bind_processor(dialect)
--            assert not bindproc or isinstance(bindproc(u'some string'),
--                    unicode)
-+            assert not bindproc or isinstance(bindproc('some string'),
-+                    str)
-
-     @testing.provide_metadata
-     def test_type_reflection(self):
-@@ -566,7 +566,7 @@
-             eq_(inspector.get_indexes('foo'), [])
-             eq_(inspector.get_indexes('foo',
-                 include_auto_indexes=True), [{'unique': 1, 'name'
--                : u'sqlite_autoindex_foo_1', 'column_names': [u'bar']}])
-+                : 'sqlite_autoindex_foo_1', 'column_names': ['bar']}])
-         finally:
-             meta.drop_all()
-
-@@ -602,7 +602,7 @@
-             'dow': '%w',
-             'week': '%W',
-             }
--        for field, subst in mapping.items():
-+        for field, subst in list(mapping.items()):
-             self.assert_compile(select([extract(field, t.c.col1)]),
-                                 "SELECT CAST(STRFTIME('%s', t.col1) AS "
-                                 "INTEGER) AS anon_1 FROM t" % subst)
-diff -r 9d0639b9d3be test/dialect/test_sybase.py
---- a/test/dialect/test_sybase.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/dialect/test_sybase.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -19,7 +19,7 @@
-             'year': 'year',
-             }
-
--        for field, subst in mapping.items():
-+        for field, subst in list(mapping.items()):
-             self.assert_compile(
-                 select([extract(field, t.c.col1)]),
-                 'SELECT DATEPART("%s", t.col1) AS anon_1 FROM t' % subst)
-diff -r 9d0639b9d3be test/engine/test_bind.py
---- a/test/engine/test_bind.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/engine/test_bind.py Sat Apr 27 19:42:17 2013 -0400
-@@ -1,6 +1,6 @@
- """tests the "bind" attribute/argument across schema and SQL,
- including the deprecated versions of these arguments"""
--from __future__ import with_statement
-+
- from sqlalchemy.testing import eq_, assert_raises
- from sqlalchemy import engine, exc
- from sqlalchemy import MetaData, ThreadLocalMetaData
-@@ -61,7 +61,7 @@
-             try:
-                 meth()
-                 assert False
--            except exc.UnboundExecutionError, e:
-+            except exc.UnboundExecutionError as e:
-                 eq_(str(e),
-                     "The MetaData is not bound to an Engine or "
-                     "Connection.  Execution can not proceed without a "
-@@ -82,7 +82,7 @@
-             try:
-                 meth()
-                 assert False
--            except exc.UnboundExecutionError, e:
-+            except exc.UnboundExecutionError as e:
-                 eq_(
-                     str(e),
-                     "The Table 'test_table' "
-diff -r 9d0639b9d3be test/engine/test_ddlemit.py
---- a/test/engine/test_ddlemit.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/engine/test_ddlemit.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -47,7 +47,7 @@
-
-         return (m, ) + tuple(
-                             Table('t%d' % i, m, Column('x', Integer))
--                            for i in xrange(1, 6)
-+                            for i in range(1, 6)
-                         )
-
-     def _table_seq_fixture(self):
-diff -r 9d0639b9d3be test/engine/test_ddlevents.py
---- a/test/engine/test_ddlevents.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/engine/test_ddlevents.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -1,4 +1,4 @@
--from __future__ import with_statement
-+
- from sqlalchemy.testing import assert_raises, assert_raises_message
- from sqlalchemy.schema import DDL, CheckConstraint, AddConstraint, \
-     DropConstraint
-diff -r 9d0639b9d3be test/engine/test_execute.py
---- a/test/engine/test_execute.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/engine/test_execute.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -1,4 +1,4 @@
--from __future__ import with_statement
-+
-
- from sqlalchemy.testing import eq_, assert_raises, assert_raises_message, \
-     config, is_
-@@ -18,7 +18,7 @@
- from sqlalchemy.engine import result as _result, default
- from sqlalchemy.engine.base import Connection, Engine
- from sqlalchemy.testing import fixtures
--import StringIO
-+import io
-
- users, metadata, users_autoinc = None, None, None
- class ExecuteTest(fixtures.TestBase):
-@@ -256,7 +256,7 @@
-             try:
-                 cursor = raw.cursor()
-                 cursor.execute("SELECTINCORRECT")
--            except testing.db.dialect.dbapi.DatabaseError, orig:
-+            except testing.db.dialect.dbapi.DatabaseError as orig:
-                 # py3k has "orig" in local scope...
-                 the_orig = orig
-         finally:
-@@ -622,7 +622,7 @@
-     def test_log_large_dict(self):
-         self.eng.execute(
-             "INSERT INTO foo (data) values (:data)",
--            [{"data":str(i)} for i in xrange(100)]
-+            [{"data":str(i)} for i in range(100)]
-         )
-         eq_(
-             self.buf.buffer[1].message,
-@@ -635,7 +635,7 @@
-     def test_log_large_list(self):
-         self.eng.execute(
-             "INSERT INTO foo (data) values (?)",
--            [(str(i), ) for i in xrange(100)]
-+            [(str(i), ) for i in range(100)]
-         )
-         eq_(
-             self.buf.buffer[1].message,
-@@ -654,7 +654,7 @@
-             "100 total bound parameter sets ...  {'data': '98'}, {'data': '99'}\]",
-             lambda: self.eng.execute(
-                 "INSERT INTO nonexistent (data) values (:data)",
--                [{"data":str(i)} for i in xrange(100)]
-+                [{"data":str(i)} for i in range(100)]
-             )
-         )
-
-@@ -668,7 +668,7 @@
-             "\('98',\), \('99',\)\]",
-             lambda: self.eng.execute(
-                 "INSERT INTO nonexistent (data) values (?)",
--                [(str(i), ) for i in xrange(100)]
-+                [(str(i), ) for i in range(100)]
-             )
-         )
-
-@@ -834,9 +834,9 @@
-
- class MockStrategyTest(fixtures.TestBase):
-     def _engine_fixture(self):
--        buf = StringIO.StringIO()
-+        buf = io.StringIO()
-         def dump(sql, *multiparams, **params):
--            buf.write(unicode(sql.compile(dialect=engine.dialect)))
-+            buf.write(str(sql.compile(dialect=engine.dialect)))
-         engine = create_engine('postgresql://', strategy='mock', executor=dump)
-         return engine, buf
-
-@@ -939,7 +939,7 @@
-     def test_row_c_sequence_check(self):
-         import csv
-         import collections
--        from StringIO import StringIO
-+        from io import StringIO
-
-         metadata = MetaData()
-         metadata.bind = 'sqlite://'
-@@ -1026,7 +1026,7 @@
-         )
-         m.create_all(engine)
-         engine.execute(t.insert(), [
--            {'x':i, 'y':"t_%d" % i} for i in xrange(1, 12)
-+            {'x':i, 'y':"t_%d" % i} for i in range(1, 12)
-         ])
-
-     def _test_proxy(self, cls):
-@@ -1039,13 +1039,13 @@
-         assert isinstance(r, cls)
-         for i in range(5):
-             rows.append(r.fetchone())
--        eq_(rows, [(i, "t_%d" % i) for i in xrange(1, 6)])
-+        eq_(rows, [(i, "t_%d" % i) for i in range(1, 6)])
-
-         rows = r.fetchmany(3)
--        eq_(rows, [(i, "t_%d" % i) for i in xrange(6, 9)])
-+        eq_(rows, [(i, "t_%d" % i) for i in range(6, 9)])
-
-         rows = r.fetchall()
--        eq_(rows, [(i, "t_%d" % i) for i in xrange(9, 12)])
-+        eq_(rows, [(i, "t_%d" % i) for i in range(9, 12)])
-
-         r = self.engine.execute(select([self.table]))
-         rows = r.fetchmany(None)
-@@ -1059,7 +1059,7 @@
-
-         r = self.engine.execute(select([self.table]).limit(5))
-         rows = r.fetchmany(6)
--        eq_(rows, [(i, "t_%d" % i) for i in xrange(1, 6)])
-+        eq_(rows, [(i, "t_%d" % i) for i in range(1, 6)])
-
-     def test_plain(self):
-         self._test_proxy(_result.ResultProxy)
-@@ -1184,7 +1184,7 @@
-         try:
-             conn.execute("SELECT FOO FROM I_DONT_EXIST")
-             assert False
--        except tsa.exc.DBAPIError, e:
-+        except tsa.exc.DBAPIError as e:
-             assert canary[0][2] is e.orig
-             assert canary[0][0] == "SELECT FOO FROM I_DONT_EXIST"
-
-diff -r 9d0639b9d3be test/engine/test_parseconnect.py
---- a/test/engine/test_parseconnect.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/engine/test_parseconnect.py Sat Apr 27 19:42:17 2013 -0400
-@@ -1,6 +1,6 @@
- from sqlalchemy.testing import assert_raises, assert_raises_message, eq_
--import ConfigParser
--import StringIO
-+import configparser
-+import io
- import sqlalchemy.engine.url as url
- from sqlalchemy import create_engine, engine_from_config, exc, pool
- from sqlalchemy.engine.util import _coerce_config
-@@ -103,8 +103,8 @@
- pool_threadlocal=1
- pool_timeout=10
- """
--        ini = ConfigParser.ConfigParser()
--        ini.readfp(StringIO.StringIO(raw))
-+        ini = configparser.ConfigParser()
-+        ini.readfp(io.StringIO(raw))
-
-         expected = {
-             'url': 'postgresql://scott:tiger@somehost/test?fooz=somevalue',
-@@ -234,7 +234,7 @@
-                           : True}, convert_unicode=True)
-         try:
-             e.connect()
--        except tsa.exc.DBAPIError, de:
-+        except tsa.exc.DBAPIError as de:
-             assert not de.connection_invalidated
-
-     def test_ensure_dialect_does_is_disconnect_no_conn(self):
-@@ -266,7 +266,7 @@
-         try:
-             create_engine('sqlite://', module=ThrowOnConnect()).connect()
-             assert False
--        except tsa.exc.DBAPIError, de:
-+        except tsa.exc.DBAPIError as de:
-             assert de.connection_invalidated
-
-     def test_urlattr(self):
-diff -r 9d0639b9d3be test/engine/test_pool.py
---- a/test/engine/test_pool.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/engine/test_pool.py Sat Apr 27 19:42:17 2013 -0400
-@@ -525,23 +525,23 @@
-                 self.assert_((item in innerself.checked_out) == in_cout)
-                 self.assert_((item in innerself.checked_in) == in_cin)
-             def inst_connect(self, con, record):
--                print "connect(%s, %s)" % (con, record)
-+                print("connect(%s, %s)" % (con, record))
-                 assert con is not None
-                 assert record is not None
-                 self.connected.append(con)
-             def inst_first_connect(self, con, record):
--                print "first_connect(%s, %s)" % (con, record)
-+                print("first_connect(%s, %s)" % (con, record))
-                 assert con is not None
-                 assert record is not None
-                 self.first_connected.append(con)
-             def inst_checkout(self, con, record, proxy):
--                print "checkout(%s, %s, %s)" % (con, record, proxy)
-+                print("checkout(%s, %s, %s)" % (con, record, proxy))
-                 assert con is not None
-                 assert record is not None
-                 assert proxy is not None
-                 self.checked_out.append(con)
-             def inst_checkin(self, con, record):
--                print "checkin(%s, %s)" % (con, record)
-+                print("checkin(%s, %s)" % (con, record))
-                 # con can be None if invalidated
-                 assert record is not None
-                 self.checked_in.append(con)
-@@ -738,8 +738,8 @@
-         def status(pool):
-             tup = pool.size(), pool.checkedin(), pool.overflow(), \
-                 pool.checkedout()
--            print 'Pool size: %d  Connections in pool: %d Current '\
--                'Overflow: %d Current Checked out connections: %d' % tup
-+            print('Pool size: %d  Connections in pool: %d Current '\
-+                'Overflow: %d Current Checked out connections: %d' % tup)
-             return tup
-
-         c1 = p.connect()
-@@ -794,7 +794,7 @@
-         try:
-             c4 = p.connect()
-             assert False
--        except tsa.exc.TimeoutError, e:
-+        except tsa.exc.TimeoutError as e:
-             assert int(time.time() - now) == 2
-
-     def test_timeout_race(self):
-@@ -812,18 +812,18 @@
-                 max_overflow = 1, use_threadlocal = False, timeout=3)
-         timeouts = []
-         def checkout():
--            for x in xrange(1):
-+            for x in range(1):
-                 now = time.time()
-                 try:
-                     c1 = p.connect()
--                except tsa.exc.TimeoutError, e:
-+                except tsa.exc.TimeoutError as e:
-                     timeouts.append(time.time() - now)
-                     continue
-                 time.sleep(4)
-                 c1.close()
-
-         threads = []
--        for i in xrange(10):
-+        for i in range(10):
-             th = threading.Thread(target=checkout)
-             th.start()
-             threads.append(th)
-@@ -860,7 +860,7 @@
-                 except tsa.exc.TimeoutError:
-                     pass
-         threads = []
--        for i in xrange(thread_count):
-+        for i in range(thread_count):
-             th = threading.Thread(target=whammy)
-             th.start()
-             threads.append(th)
-@@ -1007,8 +1007,8 @@
-             strong_refs.add(c.connection)
-             return c
-
--        for j in xrange(5):
--            conns = [_conn() for i in xrange(4)]
-+        for j in range(5):
-+            conns = [_conn() for i in range(4)]
-             for c in conns:
-                 c.close()
-
-@@ -1152,7 +1152,7 @@
-                 return p.connect()
-
-         def checkout():
--            for x in xrange(10):
-+            for x in range(10):
-                 c = _conn()
-                 assert c
-                 c.cursor()
-@@ -1160,7 +1160,7 @@
-                 time.sleep(.1)
-
-         threads = []
--        for i in xrange(10):
-+        for i in range(10):
-             th = threading.Thread(target=checkout)
-             th.start()
-             threads.append(th)
-diff -r 9d0639b9d3be test/engine/test_processors.py
---- a/test/engine/test_processors.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/engine/test_processors.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -53,7 +53,7 @@
-         cls.module = type("util", (object,),
-                 dict(
-                     (k, staticmethod(v))
--                        for k, v in processors.py_fallback().items()
-+                        for k, v in list(processors.py_fallback().items())
-                 )
-             )
-
-@@ -156,7 +156,7 @@
-         cls.module = type("util", (object,),
-                 dict(
-                     (k, staticmethod(v))
--                        for k, v in util.py_fallback().items()
-+                        for k, v in list(util.py_fallback().items())
-                 )
-         )
-
-diff -r 9d0639b9d3be test/engine/test_reconnect.py
---- a/test/engine/test_reconnect.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/engine/test_reconnect.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -173,7 +173,7 @@
-         try:
-             trans.commit()
-             assert False
--        except tsa.exc.InvalidRequestError, e:
-+        except tsa.exc.InvalidRequestError as e:
-             assert str(e) \
-                 == "Can't reconnect until invalid transaction is "\
-                 "rolled back"
-@@ -370,7 +370,7 @@
-         try:
-             conn.execute(select([1]))
-             assert False
--        except tsa.exc.DBAPIError, e:
-+        except tsa.exc.DBAPIError as e:
-             if not e.connection_invalidated:
-                 raise
-
-@@ -386,7 +386,7 @@
-         try:
-             conn.execute(select([1]))
-             assert False
--        except tsa.exc.DBAPIError, e:
-+        except tsa.exc.DBAPIError as e:
-             if not e.connection_invalidated:
-                 raise
-         assert conn.invalidated
-@@ -407,7 +407,7 @@
-         try:
-             c1.execute(select([1]))
-             assert False
--        except tsa.exc.DBAPIError, e:
-+        except tsa.exc.DBAPIError as e:
-             assert e.connection_invalidated
-
-         p2 = engine.pool
-@@ -415,7 +415,7 @@
-         try:
-             c2.execute(select([1]))
-             assert False
--        except tsa.exc.DBAPIError, e:
-+        except tsa.exc.DBAPIError as e:
-             assert e.connection_invalidated
-
-         # pool isn't replaced
-@@ -503,7 +503,7 @@
-         try:
-             conn.execute(select([1]))
-             assert False
--        except tsa.exc.DBAPIError, e:
-+        except tsa.exc.DBAPIError as e:
-             if not e.connection_invalidated:
-                 raise
-         assert not conn.closed
-@@ -523,7 +523,7 @@
-         try:
-             conn.execute(select([1]))
-             assert False
--        except tsa.exc.DBAPIError, e:
-+        except tsa.exc.DBAPIError as e:
-             if not e.connection_invalidated:
-                 raise
-
-@@ -542,7 +542,7 @@
-         try:
-             conn.execute(select([1]))
-             assert False
--        except tsa.exc.DBAPIError, e:
-+        except tsa.exc.DBAPIError as e:
-             if not e.connection_invalidated:
-                 raise
-         assert not conn.closed
-@@ -558,7 +558,7 @@
-         try:
-             trans.commit()
-             assert False
--        except tsa.exc.InvalidRequestError, e:
-+        except tsa.exc.InvalidRequestError as e:
-             assert str(e) \
-                 == "Can't reconnect until invalid transaction is "\
-                 "rolled back"
-@@ -634,13 +634,13 @@
-     def test_invalidate_on_results(self):
-         conn = engine.connect()
-         result = conn.execute('select * from sometable')
--        for x in xrange(20):
-+        for x in range(20):
-             result.fetchone()
-         engine.test_shutdown()
-         try:
--            print 'ghost result: %r' % result.fetchone()
-+            print('ghost result: %r' % result.fetchone())
-             assert False
--        except tsa.exc.DBAPIError, e:
-+        except tsa.exc.DBAPIError as e:
-             if not e.connection_invalidated:
-                 raise
-         assert conn.invalidated
-diff -r 9d0639b9d3be test/engine/test_reflection.py
---- a/test/engine/test_reflection.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/engine/test_reflection.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -811,7 +811,7 @@
-         try:
-             m4.reflect(only=['rt_a', 'rt_f'])
-             self.assert_(False)
--        except sa.exc.InvalidRequestError, e:
-+        except sa.exc.InvalidRequestError as e:
-             self.assert_(e.args[0].endswith('(rt_f)'))
-
-         m5 = MetaData(testing.db)
-@@ -833,7 +833,7 @@
-         )
-
-         if existing:
--            print "Other tables present in database, skipping some checks."
-+            print("Other tables present in database, skipping some checks.")
-         else:
-             baseline.drop_all()
-             m9 = MetaData(testing.db)
-@@ -1041,19 +1041,19 @@
-         cls.metadata = metadata = MetaData()
-
-         no_multibyte_period = set([
--            (u'plain', u'col_plain', u'ix_plain')
-+            ('plain', 'col_plain', 'ix_plain')
-         ])
-         no_has_table = [
--            (u'no_has_table_1', u'col_Unit\u00e9ble', u'ix_Unit\u00e9ble'),
--            (u'no_has_table_2', u'col_\u6e2c\u8a66', u'ix_\u6e2c\u8a66'),
-+            ('no_has_table_1', 'col_Unit\u00e9ble', 'ix_Unit\u00e9ble'),
-+            ('no_has_table_2', 'col_\u6e2c\u8a66', 'ix_\u6e2c\u8a66'),
-         ]
-         no_case_sensitivity = [
--            (u'\u6e2c\u8a66', u'col_\u6e2c\u8a66', u'ix_\u6e2c\u8a66'),
--            (u'unit\u00e9ble', u'col_unit\u00e9ble', u'ix_unit\u00e9ble'),
-+            ('\u6e2c\u8a66', 'col_\u6e2c\u8a66', 'ix_\u6e2c\u8a66'),
-+            ('unit\u00e9ble', 'col_unit\u00e9ble', 'ix_unit\u00e9ble'),
-         ]
-         full = [
--            (u'Unit\u00e9ble', u'col_Unit\u00e9ble', u'ix_Unit\u00e9ble'),
--            (u'\u6e2c\u8a66', u'col_\u6e2c\u8a66', u'ix_\u6e2c\u8a66'),
-+            ('Unit\u00e9ble', 'col_Unit\u00e9ble', 'ix_Unit\u00e9ble'),
-+            ('\u6e2c\u8a66', 'col_\u6e2c\u8a66', 'ix_\u6e2c\u8a66'),
-         ]
-
-         # as you can see, our options for this kind of thing
-diff -r 9d0639b9d3be test/engine/test_transaction.py
---- a/test/engine/test_transaction.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/engine/test_transaction.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -74,8 +74,8 @@
-             connection.execute(users.insert(), user_id=1, user_name='user3')
-             transaction.commit()
-             assert False
--        except Exception , e:
--            print "Exception: ", e
-+        except Exception as e:
-+            print("Exception: ", e)
-             transaction.rollback()
-
-         result = connection.execute("select * from query_users")
-@@ -121,10 +121,10 @@
-                     trans2.rollback()
-                     raise
-                 transaction.rollback()
--            except Exception, e:
-+            except Exception as e:
-                 transaction.rollback()
-                 raise
--        except Exception, e:
-+        except Exception as e:
-             try:
-                 assert str(e) == 'uh oh'  # and not "This transaction is
-                                           # inactive"
-@@ -167,7 +167,7 @@
-         connection.execute(users.insert(), user_id=2, user_name='user2')
-         try:
-             connection.execute(users.insert(), user_id=2, user_name='user2.5')
--        except Exception, e:
-+        except Exception as e:
-             trans.__exit__(*sys.exc_info())
-
-         assert not trans.is_active
-@@ -1019,7 +1019,7 @@
-         con = testing.db.connect()
-         sel = counters.select(for_update=update_style,
-                               whereclause=counters.c.counter_id == 1)
--        for i in xrange(count):
-+        for i in range(count):
-             trans = con.begin()
-             try:
-                 existing = con.execute(sel).first()
-@@ -1033,7 +1033,7 @@
-                     raise AssertionError('Got %s post-update, expected '
-                             '%s' % (readback['counter_value'], incr))
-                 trans.commit()
--            except Exception, e:
-+            except Exception as e:
-                 trans.rollback()
-                 errors.append(e)
-                 break
-@@ -1057,7 +1057,7 @@
-         db.execute(counters.insert(), counter_id=1, counter_value=0)
-         iterations, thread_count = 10, 5
-         threads, errors = [], []
--        for i in xrange(thread_count):
-+        for i in range(thread_count):
-             thrd = threading.Thread(target=self.increment,
-                                     args=(iterations, ),
-                                     kwargs={'errors': errors,
-@@ -1088,7 +1088,7 @@
-             rows = con.execute(sel).fetchall()
-             time.sleep(0.25)
-             trans.commit()
--        except Exception, e:
-+        except Exception as e:
-             trans.rollback()
-             errors.append(e)
-         con.close()
-@@ -1105,7 +1105,7 @@
-             db.execute(counters.insert(), counter_id=cid + 1,
-                        counter_value=0)
-         errors, threads = [], []
--        for i in xrange(thread_count):
-+        for i in range(thread_count):
-             thrd = threading.Thread(target=self.overlap,
-                                     args=(groups.pop(0), errors,
-                                     update_style))
-diff -r 9d0639b9d3be test/ext/declarative/test_basic.py
---- a/test/ext/declarative/test_basic.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/ext/declarative/test_basic.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -127,14 +127,13 @@
-         class BrokenMeta(type):
-             def __getattribute__(self, attr):
-                 if attr == 'xyzzy':
--                    raise AttributeError, 'xyzzy'
-+                    raise AttributeError('xyzzy')
-                 else:
-                     return object.__getattribute__(self,attr)
-
-         # even though this class has an xyzzy attribute, getattr(cls,"xyzzy")
-         # fails
--        class BrokenParent(object):
--            __metaclass__ = BrokenMeta
-+        class BrokenParent(object, metaclass=BrokenMeta):
-             xyzzy = "magic"
-
-         # _as_declarative() inspects obj.__class__.__bases__
-@@ -1458,12 +1457,12 @@
-
-         @classmethod
-         def insert_data(cls):
--            params = [dict(zip(('id', 'name'), column_values))
-+            params = [dict(list(zip(('id', 'name'), column_values)))
-                       for column_values in [(7, 'jack'), (8, 'ed'), (9,
-                       'fred'), (10, 'chuck')]]
-             User.__table__.insert().execute(params)
--            Address.__table__.insert().execute([dict(zip(('id',
--                    'user_id', 'email'), column_values))
-+            Address.__table__.insert().execute([dict(list(zip(('id',
-+                    'user_id', 'email'), column_values)))
-                     for column_values in [(1, 7, 'jack@bean.com'), (2,
-                     8, 'ed@wood.com'), (3, 8, 'ed@bettyboop.com'), (4,
-                     8, 'ed@lala.com'), (5, 9, 'fred@fred.com')]])
-@@ -1492,6 +1491,6 @@
- for inline in True, False:
-     for stringbased in True, False:
-         testclass = _produce_test(inline, stringbased)
--        exec '%s = testclass' % testclass.__name__
-+        exec('%s = testclass' % testclass.__name__)
-         del testclass
-
-diff -r 9d0639b9d3be test/ext/declarative/test_clsregistry.py
---- a/test/ext/declarative/test_clsregistry.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/ext/declarative/test_clsregistry.py Sat Apr 27 19:42:17 2013 -0400
-@@ -124,7 +124,7 @@
-
-         base = weakref.WeakValueDictionary()
-
--        for i in xrange(3):
-+        for i in range(3):
-             f1 = MockClass(base, "foo.bar.Foo")
-             f2 = MockClass(base, "foo.alt.Foo")
-             clsregistry.add_class("Foo", f1)
-diff -r 9d0639b9d3be test/ext/declarative/test_inheritance.py
---- a/test/ext/declarative/test_inheritance.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/ext/declarative/test_inheritance.py Sat Apr 27 19:42:17 2013 -0400
-@@ -573,7 +573,7 @@
-             primary_language = Column(String(50))
-
-         assert Person.__table__.c.golf_swing is not None
--        assert not Person.__table__.c.has_key('primary_language')
-+        assert 'primary_language' not in Person.__table__.c
-         assert Engineer.__table__.c.primary_language is not None
-         assert Engineer.primary_language is not None
-         assert Manager.golf_swing is not None
-diff -r 9d0639b9d3be test/ext/declarative/test_mixin.py
---- a/test/ext/declarative/test_mixin.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/ext/declarative/test_mixin.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -685,7 +685,7 @@
-             __mapper_args__ = dict(polymorphic_identity='specific')
-
-         assert Specific.__table__ is Generic.__table__
--        eq_(Generic.__table__.c.keys(), ['id', 'type', 'value'])
-+        eq_(list(Generic.__table__.c.keys()), ['id', 'type', 'value'])
-         assert class_mapper(Specific).polymorphic_on \
-             is Generic.__table__.c.type
-         eq_(class_mapper(Specific).polymorphic_identity, 'specific')
-@@ -714,9 +714,9 @@
-
-         eq_(Generic.__table__.name, 'generic')
-         eq_(Specific.__table__.name, 'specific')
--        eq_(Generic.__table__.c.keys(), ['timestamp', 'id',
-+        eq_(list(Generic.__table__.c.keys()), ['timestamp', 'id',
-             'python_type'])
--        eq_(Specific.__table__.c.keys(), ['id'])
-+        eq_(list(Specific.__table__.c.keys()), ['id'])
-         eq_(Generic.__table__.kwargs, {'mysql_engine': 'InnoDB'})
-         eq_(Specific.__table__.kwargs, {'mysql_engine': 'InnoDB'})
-
-@@ -749,12 +749,12 @@
-                         primary_key=True)
-
-         eq_(BaseType.__table__.name, 'basetype')
--        eq_(BaseType.__table__.c.keys(), ['timestamp', 'type', 'id',
-+        eq_(list(BaseType.__table__.c.keys()), ['timestamp', 'type', 'id',
-             'value'])
-         eq_(BaseType.__table__.kwargs, {'mysql_engine': 'InnoDB'})
-         assert Single.__table__ is BaseType.__table__
-         eq_(Joined.__table__.name, 'joined')
--        eq_(Joined.__table__.c.keys(), ['id'])
-+        eq_(list(Joined.__table__.c.keys()), ['id'])
-         eq_(Joined.__table__.kwargs, {'mysql_engine': 'InnoDB'})
-
-     def test_col_copy_vs_declared_attr_joined_propagation(self):
-@@ -839,7 +839,7 @@
-             __mapper_args__ = dict(polymorphic_identity='specific')
-
-         eq_(BaseType.__table__.name, 'basetype')
--        eq_(BaseType.__table__.c.keys(), ['type', 'id', 'value'])
-+        eq_(list(BaseType.__table__.c.keys()), ['type', 'id', 'value'])
-         assert Specific.__table__ is BaseType.__table__
-         assert class_mapper(Specific).polymorphic_on \
-             is BaseType.__table__.c.type
-@@ -870,9 +870,9 @@
-                         primary_key=True)
-
-         eq_(BaseType.__table__.name, 'basetype')
--        eq_(BaseType.__table__.c.keys(), ['type', 'id', 'value'])
-+        eq_(list(BaseType.__table__.c.keys()), ['type', 'id', 'value'])
-         eq_(Specific.__table__.name, 'specific')
--        eq_(Specific.__table__.c.keys(), ['id'])
-+        eq_(list(Specific.__table__.c.keys()), ['id'])
-
-     def test_single_back_propagate(self):
-
-@@ -891,7 +891,7 @@
-
-             __mapper_args__ = dict(polymorphic_identity='specific')
-
--        eq_(BaseType.__table__.c.keys(), ['type', 'id', 'timestamp'])
-+        eq_(list(BaseType.__table__.c.keys()), ['type', 'id', 'timestamp'])
-
-     def test_table_in_model_and_same_column_in_mixin(self):
-
-@@ -987,7 +987,7 @@
-             id = Column(Integer, primary_key=True)
-             __tablename__ = 'model'
-
--        eq_(Model.__table__.c.keys(), ['col1', 'col3', 'col2', 'col4',
-+        eq_(list(Model.__table__.c.keys()), ['col1', 'col3', 'col2', 'col4',
-             'id'])
-
-     def test_honor_class_mro_one(self):
-@@ -1078,8 +1078,8 @@
-             filter_class = FilterB
-             id = Column(Integer(), primary_key=True)
-
--        TypeA(filters=[u'foo'])
--        TypeB(filters=[u'foo'])
-+        TypeA(filters=['foo'])
-+        TypeB(filters=['foo'])
-
- class DeclarativeMixinPropertyTest(DeclarativeTestBase):
-
-diff -r 9d0639b9d3be test/ext/test_associationproxy.py
---- a/test/ext/test_associationproxy.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/ext/test_associationproxy.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -288,7 +288,7 @@
-         ch = Child('a', 'regular')
-         p1._children.append(ch)
-
--        self.assert_(ch in p1._children.values())
-+        self.assert_(ch in list(p1._children.values()))
-         self.assert_(len(p1._children) == 1)
-
-         self.assert_(p1.children)
-@@ -300,7 +300,7 @@
-
-         p1.children['b'] = 'proxied'
-
--        self.assert_('proxied' in p1.children.values())
-+        self.assert_('proxied' in list(p1.children.values()))
-         self.assert_('b' in p1.children)
-         self.assert_('proxied' not in p1._children)
-         self.assert_(len(p1.children) == 2)
-@@ -526,9 +526,9 @@
-                     try:
-                         self.assert_(p.children == control)
-                     except:
--                        print 'Test %s.%s(%s):' % (set(base), op, other)
--                        print 'want', repr(control)
--                        print 'got', repr(p.children)
-+                        print('Test %s.%s(%s):' % (set(base), op, other))
-+                        print('want', repr(control))
-+                        print('got', repr(p.children))
-                         raise
-
-                     p = self.roundtrip(p)
-@@ -536,9 +536,9 @@
-                     try:
-                         self.assert_(p.children == control)
-                     except:
--                        print 'Test %s.%s(%s):' % (base, op, other)
--                        print 'want', repr(control)
--                        print 'got', repr(p.children)
-+                        print('Test %s.%s(%s):' % (base, op, other))
-+                        print('want', repr(control))
-+                        print('got', repr(p.children))
-                         raise
-
-         # in-place mutations
-@@ -553,15 +553,15 @@
-                     p.children = base[:]
-                     control = set(base[:])
-
--                    exec "p.children %s other" % op
--                    exec "control %s other" % op
-+                    exec("p.children %s other" % op)
-+                    exec("control %s other" % op)
-
-                     try:
-                         self.assert_(p.children == control)
-                     except:
--                        print 'Test %s %s %s:' % (set(base), op, other)
--                        print 'want', repr(control)
--                        print 'got', repr(p.children)
-+                        print('Test %s %s %s:' % (set(base), op, other))
-+                        print('want', repr(control))
-+                        print('got', repr(p.children))
-                         raise
-
-                     p = self.roundtrip(p)
-@@ -569,9 +569,9 @@
-                     try:
-                         self.assert_(p.children == control)
-                     except:
--                        print 'Test %s %s %s:' % (base, op, other)
--                        print 'want', repr(control)
--                        print 'got', repr(p.children)
-+                        print('Test %s %s %s:' % (base, op, other))
-+                        print('want', repr(control))
-+                        print('got', repr(p.children))
-                         raise
-
-
-diff -r 9d0639b9d3be test/ext/test_serializer.py
---- a/test/ext/test_serializer.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/ext/test_serializer.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -47,12 +47,12 @@
-
-     @classmethod
-     def insert_data(cls):
--        params = [dict(zip(('id', 'name'), column_values))
-+        params = [dict(list(zip(('id', 'name'), column_values)))
-                   for column_values in [(7, 'jack'), (8, 'ed'), (9,
-                   'fred'), (10, 'chuck')]]
-         users.insert().execute(params)
--        addresses.insert().execute([dict(zip(('id', 'user_id', 'email'
--                                   ), column_values))
-+        addresses.insert().execute([dict(list(zip(('id', 'user_id', 'email'
-+                                   ), column_values)))
-                                    for column_values in [(1, 7,
-                                    'jack@bean.com'), (2, 8,
-                                    'ed@wood.com'), (3, 8,
-@@ -85,8 +85,8 @@
-                                    users.metadata, None)
-         eq_(str(expr), str(re_expr))
-         assert re_expr.bind is testing.db
--        eq_(re_expr.execute().fetchall(), [(7, u'jack'), (8, u'ed'),
--            (8, u'ed'), (8, u'ed'), (9, u'fred')])
-+        eq_(re_expr.execute().fetchall(), [(7, 'jack'), (8, 'ed'),
-+            (8, 'ed'), (8, 'ed'), (9, 'fred')])
-
-     def test_query_one(self):
-         q = Session.query(User).\
-@@ -121,7 +121,7 @@
-         q2 = serializer.loads(serializer.dumps(q, -1), users.metadata,
-                               Session)
-         eq_(q2.all(), [User(name='fred')])
--        eq_(list(q2.values(User.id, User.name)), [(9, u'fred')])
-+        eq_(list(q2.values(User.id, User.name)), [(9, 'fred')])
-
-     def test_query_three(self):
-         ua = aliased(User)
-@@ -134,7 +134,7 @@
-
-         # try to pull out the aliased entity here...
-         ua_2 = q2._entities[0].entity_zero.entity
--        eq_(list(q2.values(ua_2.id, ua_2.name)), [(9, u'fred')])
-+        eq_(list(q2.values(ua_2.id, ua_2.name)), [(9, 'fred')])
-
-     def test_orm_join(self):
-         from sqlalchemy.orm.util import join
-diff -r 9d0639b9d3be test/orm/inheritance/test_assorted_poly.py
---- a/test/orm/inheritance/test_assorted_poly.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/inheritance/test_assorted_poly.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -18,7 +18,7 @@
-
- class AttrSettable(object):
-     def __init__(self, **kwargs):
--        [setattr(self, k, v) for k, v in kwargs.iteritems()]
-+        [setattr(self, k, v) for k, v in kwargs.items()]
-     def __repr__(self):
-         return self.__class__.__name__ + "(%s)" % (hex(id(self)))
-
-@@ -386,7 +386,7 @@
-         # class definitions
-         class Person(object):
-             def __init__(self, **kwargs):
--                for key, value in kwargs.iteritems():
-+                for key, value in kwargs.items():
-                     setattr(self, key, value)
-             def __repr__(self):
-                 return "Ordinary person %s" % self.name
-@@ -400,7 +400,7 @@
-                         (self.name, self.longer_status)
-         class Car(object):
-             def __init__(self, **kwargs):
--                for key, value in kwargs.iteritems():
-+                for key, value in kwargs.items():
-                     setattr(self, key, value)
-             def __repr__(self):
-                 return "Car number %d" % self.car_id
-@@ -512,7 +512,7 @@
-
-         class Person(object):
-             def __init__(self, **kwargs):
--                for key, value in kwargs.iteritems():
-+                for key, value in kwargs.items():
-                     setattr(self, key, value)
-             def __repr__(self):
-                 return "Ordinary person %s" % self.name
-@@ -526,7 +526,7 @@
-                         (self.name, self.longer_status)
-         class Car(object):
-             def __init__(self, **kwargs):
--                for key, value in kwargs.iteritems():
-+                for key, value in kwargs.items():
-                     setattr(self, key, value)
-             def __repr__(self):
-                 return "Car number %d" % self.car_id
-@@ -646,7 +646,7 @@
-
-         class PersistentObject(object):
-             def __init__(self, **kwargs):
--                for key, value in kwargs.iteritems():
-+                for key, value in kwargs.items():
-                     setattr(self, key, value)
-
-         class Status(PersistentObject):
-@@ -838,7 +838,7 @@
-         # class definitions
-         class PersistentObject(object):
-             def __init__(self, **kwargs):
--                for key, value in kwargs.iteritems():
-+                for key, value in kwargs.items():
-                     setattr(self, key, value)
-         class Status(PersistentObject):
-             def __repr__(self):
-@@ -968,7 +968,7 @@
-     def test_threelevels(self):
-         class Employee( object):
-             def set( me, **kargs):
--                for k,v in kargs.iteritems(): setattr( me, k, v)
-+                for k,v in kargs.items(): setattr( me, k, v)
-                 return me
-             def __str__(me):
-                 return str(me.__class__.__name__)+':'+str(me.name)
-diff -r 9d0639b9d3be test/orm/inheritance/test_basic.py
---- a/test/orm/inheritance/test_basic.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/inheritance/test_basic.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -1355,7 +1355,7 @@
-     def _do_test(self, j1, j2):
-         class A(object):
-            def __init__(self, **kwargs):
--               for key, value in kwargs.items():
-+               for key, value in list(kwargs.items()):
-                     setattr(self, key, value)
-
-         class B(A):
-@@ -1830,7 +1830,7 @@
-                 "SELECT sub.counter AS sub_counter, base.counter AS base_counter, "
-                 "sub.counter2 AS sub_counter2 FROM base JOIN sub ON "
-                 "base.id = sub.id WHERE base.id = :param_1",
--                lambda ctx:{u'param_1': s1.id}
-+                lambda ctx:{'param_1': s1.id}
-             ),
-         )
-
-@@ -1910,7 +1910,7 @@
-                 "SELECT subsub.counter2 AS subsub_counter2, "
-                 "sub.counter2 AS sub_counter2 FROM subsub, sub "
-                 "WHERE :param_1 = sub.id AND sub.id = subsub.id",
--                lambda ctx:{u'param_1': s1.id}
-+                lambda ctx:{'param_1': s1.id}
-             ),
-         )
-
-@@ -2409,9 +2409,9 @@
-                     polymorphic_identity='foo')
-         sess = create_session()
-         f = Foo()
--        f.content_type = u'bar'
-+        f.content_type = 'bar'
-         sess.add(f)
-         sess.flush()
-         f_id = f.id
-         sess.expunge_all()
--        assert sess.query(Content).get(f_id).content_type == u'bar'
-+        assert sess.query(Content).get(f_id).content_type == 'bar'
-diff -r 9d0639b9d3be test/orm/inheritance/test_concrete.py
---- a/test/orm/inheritance/test_concrete.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/inheritance/test_concrete.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -722,10 +722,10 @@
-     @classmethod
-     def insert_data(cls):
-         refugees_table.insert().execute(dict(refugee_fid=1,
--                name=u'refugee1'), dict(refugee_fid=2, name=u'refugee2'
-+                name='refugee1'), dict(refugee_fid=2, name='refugee2'
-                 ))
-         offices_table.insert().execute(dict(office_fid=1,
--                name=u'office1'), dict(office_fid=2, name=u'office2'))
-+                name='office1'), dict(office_fid=2, name='office2'))
-
-     def test_keys(self):
-         pjoin = polymorphic_union({'refugee': refugees_table, 'office'
-diff -r 9d0639b9d3be test/orm/inheritance/test_magazine.py
---- a/test/orm/inheritance/test_magazine.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/inheritance/test_magazine.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -8,7 +8,7 @@
-
- class BaseObject(object):
-     def __init__(self, *args, **kwargs):
--        for key, value in kwargs.iteritems():
-+        for key, value in kwargs.items():
-             setattr(self, key, value)
- class Publication(BaseObject):
-     pass
-@@ -200,15 +200,15 @@
-
-
-         session.flush()
--        print [x for x in session]
-+        print([x for x in session])
-         session.expunge_all()
-
-         session.flush()
-         session.expunge_all()
-         p = session.query(Publication).filter(Publication.name=="Test").one()
-
--        print p.issues[0].locations[0].magazine.pages
--        print [page, page2, page3]
-+        print(p.issues[0].locations[0].magazine.pages)
-+        print([page, page2, page3])
-         assert repr(p.issues[0].locations[0].magazine.pages) == repr([page, page2, page3]), repr(p.issues[0].locations[0].magazine.pages)
-
-     test_roundtrip = function_named(
-diff -r 9d0639b9d3be test/orm/inheritance/test_manytomany.py
---- a/test/orm/inheritance/test_manytomany.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/inheritance/test_manytomany.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -42,7 +42,7 @@
-     def testbasic(self):
-         class Principal(object):
-             def __init__(self, **kwargs):
--                for key, value in kwargs.iteritems():
-+                for key, value in kwargs.items():
-                     setattr(self, key, value)
-
-         class User(Principal):
-@@ -94,8 +94,8 @@
-
-         mapper(Foo, foo)
-         mapper(Bar, bar, inherits=Foo)
--        print foo.join(bar).primary_key
--        print class_mapper(Bar).primary_key
-+        print(foo.join(bar).primary_key)
-+        print(class_mapper(Bar).primary_key)
-         b = Bar('somedata')
-         sess = create_session()
-         sess.add(b)
-@@ -133,8 +133,8 @@
-         sess.expunge_all()
-
-         l = sess.query(Bar).all()
--        print l[0]
--        print l[0].foos
-+        print(l[0])
-+        print(l[0].foos)
-         self.assert_unordered_result(l, Bar,
- #            {'id':1, 'data':'barfoo', 'bid':1, 'foos':(Foo, [{'id':2,'data':'subfoo1'}, {'id':3,'data':'subfoo2'}])},
-             {'id':b.id, 'data':'barfoo', 'foos':(Foo, [{'id':f1.id,'data':'subfoo1'}, {'id':f2.id,'data':'subfoo2'}])},
-@@ -197,7 +197,7 @@
-         compare = [repr(b)] + sorted([repr(o) for o in b.foos])
-         sess.expunge_all()
-         l = sess.query(Bar).all()
--        print repr(l[0]) + repr(l[0].foos)
-+        print(repr(l[0]) + repr(l[0].foos))
-         found = [repr(l[0])] + sorted([repr(o) for o in l[0].foos])
-         eq_(found, compare)
-
-@@ -239,11 +239,11 @@
-         sess.expunge_all()
-
-         l = sess.query(Blub).all()
--        print l
-+        print(l)
-         self.assert_(repr(l[0]) == compare)
-         sess.expunge_all()
-         x = sess.query(Blub).filter_by(id=blubid).one()
--        print x
-+        print(x)
-         self.assert_(repr(x) == compare)
-
-
-diff -r 9d0639b9d3be test/orm/inheritance/test_polymorphic_rel.py
---- a/test/orm/inheritance/test_polymorphic_rel.py     Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/inheritance/test_polymorphic_rel.py     Sat Apr 27 19:42:17 2013 -0400
-@@ -7,7 +7,7 @@
- from sqlalchemy import testing
- from sqlalchemy.testing import assert_raises, eq_
-
--from _poly_fixtures import Company, Person, Engineer, Manager, Boss, \
-+from ._poly_fixtures import Company, Person, Engineer, Manager, Boss, \
-     Machine, Paperwork, _Polymorphic,\
-     _PolymorphicPolymorphic, _PolymorphicUnions, _PolymorphicJoins,\
-     _PolymorphicAliasedJoins
-@@ -118,24 +118,24 @@
-         eq_(q.count(), 1)
-         eq_(q.all(), [
-             (
--                Company(company_id=1, name=u'MegaCorp, Inc.'),
-+                Company(company_id=1, name='MegaCorp, Inc.'),
-                 Engineer(
--                    status=u'regular engineer',
--                    engineer_name=u'dilbert',
--                    name=u'dilbert',
-+                    status='regular engineer',
-+                    engineer_name='dilbert',
-+                    name='dilbert',
-                     company_id=1,
--                    primary_language=u'java',
-+                    primary_language='java',
-                     person_id=1,
--                    type=u'engineer'),
--                Company(company_id=1, name=u'MegaCorp, Inc.'),
-+                    type='engineer'),
-+                Company(company_id=1, name='MegaCorp, Inc.'),
-                 Engineer(
--                    status=u'regular engineer',
--                    engineer_name=u'wally',
--                    name=u'wally',
-+                    status='regular engineer',
-+                    engineer_name='wally',
-+                    name='wally',
-                     company_id=1,
--                    primary_language=u'c++',
-+                    primary_language='c++',
-                     person_id=2,
--                    type=u'engineer')
-+                    type='engineer')
-             )
-         ])
-
-@@ -337,8 +337,8 @@
-         sess = create_session()
-
-         expected = [
--            (u'dogbert',),
--            (u'pointy haired boss',)]
-+            ('dogbert',),
-+            ('pointy haired boss',)]
-         eq_(sess.query(Manager.name)
-                 .order_by(Manager.name).all(),
-             expected)
-@@ -346,9 +346,9 @@
-     def test_join_from_columns_or_subclass_two(self):
-         sess = create_session()
-         expected = [
--            (u'dogbert',),
--            (u'dogbert',),
--            (u'pointy haired boss',)]
-+            ('dogbert',),
-+            ('dogbert',),
-+            ('pointy haired boss',)]
-         eq_(sess.query(Manager.name)
-                 .join(Paperwork, Manager.paperwork)
-                 .order_by(Manager.name).all(),
-@@ -357,14 +357,14 @@
-     def test_join_from_columns_or_subclass_three(self):
-         sess = create_session()
-         expected = [
--            (u'dilbert',),
--            (u'dilbert',),
--            (u'dogbert',),
--            (u'dogbert',),
--            (u'pointy haired boss',),
--            (u'vlad',),
--            (u'wally',),
--            (u'wally',)]
-+            ('dilbert',),
-+            ('dilbert',),
-+            ('dogbert',),
-+            ('dogbert',),
-+            ('pointy haired boss',),
-+            ('vlad',),
-+            ('wally',),
-+            ('wally',)]
-         eq_(sess.query(Person.name)
-                 .join(Paperwork, Person.paperwork)
-                 .order_by(Person.name).all(),
-@@ -375,14 +375,14 @@
-         # Load Person.name, joining from Person -> paperwork, get all
-         # the people.
-         expected = [
--            (u'dilbert',),
--            (u'dilbert',),
--            (u'dogbert',),
--            (u'dogbert',),
--            (u'pointy haired boss',),
--            (u'vlad',),
--            (u'wally',),
--            (u'wally',)]
-+            ('dilbert',),
-+            ('dilbert',),
-+            ('dogbert',),
-+            ('dogbert',),
-+            ('pointy haired boss',),
-+            ('vlad',),
-+            ('wally',),
-+            ('wally',)]
-         eq_(sess.query(Person.name)
-                 .join(paperwork,
-                       Person.person_id == paperwork.c.person_id)
-@@ -393,9 +393,9 @@
-         sess = create_session()
-         # same, on manager.  get only managers.
-         expected = [
--            (u'dogbert',),
--            (u'dogbert',),
--            (u'pointy haired boss',)]
-+            ('dogbert',),
-+            ('dogbert',),
-+            ('pointy haired boss',)]
-         eq_(sess.query(Manager.name)
-                 .join(paperwork,
-                       Manager.person_id == paperwork.c.person_id)
-@@ -418,14 +418,14 @@
-             # here, it joins to the full result set.  This is 0.6's
-             # behavior and is more or less wrong.
-             expected = [
--                (u'dilbert',),
--                (u'dilbert',),
--                (u'dogbert',),
--                (u'dogbert',),
--                (u'pointy haired boss',),
--                (u'vlad',),
--                (u'wally',),
--                (u'wally',)]
-+                ('dilbert',),
-+                ('dilbert',),
-+                ('dogbert',),
-+                ('dogbert',),
-+                ('pointy haired boss',),
-+                ('vlad',),
-+                ('wally',),
-+                ('wally',)]
-             eq_(sess.query(Person.name)
-                     .join(paperwork,
-                           Manager.person_id == paperwork.c.person_id)
-@@ -435,9 +435,9 @@
-             # when a join is present and managers.person_id is available,
-             # you get the managers.
-             expected = [
--                (u'dogbert',),
--                (u'dogbert',),
--                (u'pointy haired boss',)]
-+                ('dogbert',),
-+                ('dogbert',),
-+                ('pointy haired boss',)]
-             eq_(sess.query(Person.name)
-                     .join(paperwork,
-                           Manager.person_id == paperwork.c.person_id)
-@@ -454,9 +454,9 @@
-     def test_join_from_columns_or_subclass_eight(self):
-         sess = create_session()
-         expected = [
--            (u'dogbert',),
--            (u'dogbert',),
--            (u'pointy haired boss',)]
-+            ('dogbert',),
-+            ('dogbert',),
-+            ('pointy haired boss',)]
-         eq_(sess.query(Manager.name)
-                 .join(paperwork,
-                       Manager.person_id == paperwork.c.person_id)
-@@ -474,9 +474,9 @@
-     def test_join_from_columns_or_subclass_ten(self):
-         sess = create_session()
-         expected = [
--            (u'pointy haired boss', u'review #1'),
--            (u'dogbert', u'review #2'),
--            (u'dogbert', u'review #3')]
-+            ('pointy haired boss', 'review #1'),
-+            ('dogbert', 'review #2'),
-+            ('dogbert', 'review #3')]
-         eq_(sess.query(Manager.name, Paperwork.description)
-                 .join(Paperwork,
-                       Manager.person_id == Paperwork.person_id)
-@@ -486,9 +486,9 @@
-     def test_join_from_columns_or_subclass_eleven(self):
-         sess = create_session()
-         expected = [
--            (u'pointy haired boss',),
--            (u'dogbert',),
--            (u'dogbert',)]
-+            ('pointy haired boss',),
-+            ('dogbert',),
-+            ('dogbert',)]
-         malias = aliased(Manager)
-         eq_(sess.query(malias.name)
-                 .join(paperwork,
-@@ -977,32 +977,32 @@
-
-         expected = [
-             (Engineer(
--                status=u'regular engineer',
--                engineer_name=u'dilbert',
--                name=u'dilbert',
-+                status='regular engineer',
-+                engineer_name='dilbert',
-+                name='dilbert',
-                 company_id=1,
--                primary_language=u'java',
-+                primary_language='java',
-                 person_id=1,
--                type=u'engineer'),
--            u'MegaCorp, Inc.'),
-+                type='engineer'),
-+            'MegaCorp, Inc.'),
-             (Engineer(
--                status=u'regular engineer',
--                engineer_name=u'wally',
--                name=u'wally',
-+                status='regular engineer',
-+                engineer_name='wally',
-+                name='wally',
-                 company_id=1,
--                primary_language=u'c++',
-+                primary_language='c++',
-                 person_id=2,
--                type=u'engineer'),
--            u'MegaCorp, Inc.'),
-+                type='engineer'),
-+            'MegaCorp, Inc.'),
-             (Engineer(
--                status=u'elbonian engineer',
--                engineer_name=u'vlad',
--                name=u'vlad',
-+                status='elbonian engineer',
-+                engineer_name='vlad',
-+                name='vlad',
-                 company_id=2,
--                primary_language=u'cobol',
-+                primary_language='cobol',
-                 person_id=5,
--                type=u'engineer'),
--            u'Elbonia, Inc.')]
-+                type='engineer'),
-+            'Elbonia, Inc.')]
-         eq_(sess.query(Engineer, Company.name)
-                 .join(Company.employees)
-                 .filter(Person.type == 'engineer').all(),
-@@ -1011,9 +1011,9 @@
-     def test_mixed_entities_two(self):
-         sess = create_session()
-         expected = [
--            (u'java', u'MegaCorp, Inc.'),
--            (u'cobol', u'Elbonia, Inc.'),
--            (u'c++', u'MegaCorp, Inc.')]
-+            ('java', 'MegaCorp, Inc.'),
-+            ('cobol', 'Elbonia, Inc.'),
-+            ('c++', 'MegaCorp, Inc.')]
-         eq_(sess.query(Engineer.primary_language, Company.name)
-                 .join(Company.employees)
-                 .filter(Person.type == 'engineer')
-@@ -1025,19 +1025,19 @@
-         palias = aliased(Person)
-         expected = [(
-             Engineer(
--                status=u'elbonian engineer',
--                engineer_name=u'vlad',
--                name=u'vlad',
--                primary_language=u'cobol'),
--            u'Elbonia, Inc.',
-+                status='elbonian engineer',
-+                engineer_name='vlad',
-+                name='vlad',
-+                primary_language='cobol'),
-+            'Elbonia, Inc.',
-             Engineer(
--                status=u'regular engineer',
--                engineer_name=u'dilbert',
--                name=u'dilbert',
-+                status='regular engineer',
-+                engineer_name='dilbert',
-+                name='dilbert',
-                 company_id=1,
--                primary_language=u'java',
-+                primary_language='java',
-                 person_id=1,
--                type=u'engineer'))]
-+                type='engineer'))]
-         eq_(sess.query(Person, Company.name, palias)
-                 .join(Company.employees)
-                 .filter(Company.name == 'Elbonia, Inc.')
-@@ -1049,19 +1049,19 @@
-         palias = aliased(Person)
-         expected = [(
-             Engineer(
--                status=u'regular engineer',
--                engineer_name=u'dilbert',
--                name=u'dilbert',
-+                status='regular engineer',
-+                engineer_name='dilbert',
-+                name='dilbert',
-                 company_id=1,
--                primary_language=u'java',
-+                primary_language='java',
-                 person_id=1,
--                type=u'engineer'),
--            u'Elbonia, Inc.',
-+                type='engineer'),
-+            'Elbonia, Inc.',
-             Engineer(
--                status=u'elbonian engineer',
--                engineer_name=u'vlad',
--                name=u'vlad',
--                primary_language=u'cobol'),)]
-+                status='elbonian engineer',
-+                engineer_name='vlad',
-+                name='vlad',
-+                primary_language='cobol'),)]
-         eq_(sess.query(palias, Company.name, Person)
-                 .join(Company.employees)
-                 .filter(Company.name == 'Elbonia, Inc.')
-@@ -1071,7 +1071,7 @@
-     def test_mixed_entities_five(self):
-         sess = create_session()
-         palias = aliased(Person)
--        expected = [(u'vlad', u'Elbonia, Inc.', u'dilbert')]
-+        expected = [('vlad', 'Elbonia, Inc.', 'dilbert')]
-         eq_(sess.query(Person.name, Company.name, palias.name)
-                 .join(Company.employees)
-                 .filter(Company.name == 'Elbonia, Inc.')
-@@ -1082,9 +1082,9 @@
-         sess = create_session()
-         palias = aliased(Person)
-         expected = [
--            (u'manager', u'dogbert', u'engineer', u'dilbert'),
--            (u'manager', u'dogbert', u'engineer', u'wally'),
--            (u'manager', u'dogbert', u'boss', u'pointy haired boss')]
-+            ('manager', 'dogbert', 'engineer', 'dilbert'),
-+            ('manager', 'dogbert', 'engineer', 'wally'),
-+            ('manager', 'dogbert', 'boss', 'pointy haired boss')]
-         eq_(sess.query(Person.type, Person.name, palias.type, palias.name)
-                 .filter(Person.company_id == palias.company_id)
-                 .filter(Person.name == 'dogbert')
-@@ -1095,14 +1095,14 @@
-     def test_mixed_entities_seven(self):
-         sess = create_session()
-         expected = [
--            (u'dilbert', u'tps report #1'),
--            (u'dilbert', u'tps report #2'),
--            (u'dogbert', u'review #2'),
--            (u'dogbert', u'review #3'),
--            (u'pointy haired boss', u'review #1'),
--            (u'vlad', u'elbonian missive #3'),
--            (u'wally', u'tps report #3'),
--            (u'wally', u'tps report #4')]
-+            ('dilbert', 'tps report #1'),
-+            ('dilbert', 'tps report #2'),
-+            ('dogbert', 'review #2'),
-+            ('dogbert', 'review #3'),
-+            ('pointy haired boss', 'review #1'),
-+            ('vlad', 'elbonian missive #3'),
-+            ('wally', 'tps report #3'),
-+            ('wally', 'tps report #4')]
-         eq_(sess.query(Person.name, Paperwork.description)
-                 .filter(Person.person_id == Paperwork.person_id)
-                 .order_by(Person.name, Paperwork.description).all(),
-@@ -1116,7 +1116,7 @@
-
-     def test_mixed_entities_nine(self):
-         sess = create_session()
--        expected = [(u'Elbonia, Inc.', 1), (u'MegaCorp, Inc.', 4)]
-+        expected = [('Elbonia, Inc.', 1), ('MegaCorp, Inc.', 4)]
-         eq_(sess.query(Company.name, func.count(Person.person_id))
-                 .filter(Company.company_id == Person.company_id)
-                 .group_by(Company.name)
-@@ -1125,7 +1125,7 @@
-
-     def test_mixed_entities_ten(self):
-         sess = create_session()
--        expected = [(u'Elbonia, Inc.', 1), (u'MegaCorp, Inc.', 4)]
-+        expected = [('Elbonia, Inc.', 1), ('MegaCorp, Inc.', 4)]
-         eq_(sess.query(Company.name, func.count(Person.person_id))
-                 .join(Company.employees)
-                 .group_by(Company.name)
-@@ -1153,14 +1153,14 @@
-
-     def test_mixed_entities_eleven(self):
-         sess = create_session()
--        expected = [(u'java',), (u'c++',), (u'cobol',)]
-+        expected = [('java',), ('c++',), ('cobol',)]
-         eq_(sess.query(Engineer.primary_language)
-                 .filter(Person.type == 'engineer').all(),
-             expected)
-
-     def test_mixed_entities_twelve(self):
-         sess = create_session()
--        expected = [(u'vlad', u'Elbonia, Inc.')]
-+        expected = [('vlad', 'Elbonia, Inc.')]
-         eq_(sess.query(Person.name, Company.name)
-                 .join(Company.employees)
-                 .filter(Company.name == 'Elbonia, Inc.').all(),
-@@ -1168,15 +1168,15 @@
-
-     def test_mixed_entities_thirteen(self):
-         sess = create_session()
--        expected = [(u'pointy haired boss', u'fore')]
-+        expected = [('pointy haired boss', 'fore')]
-         eq_(sess.query(Boss.name, Boss.golf_swing).all(), expected)
-
-     def test_mixed_entities_fourteen(self):
-         sess = create_session()
-         expected = [
--            (u'dilbert', u'java'),
--            (u'wally', u'c++'),
--            (u'vlad', u'cobol')]
-+            ('dilbert', 'java'),
-+            ('wally', 'c++'),
-+            ('vlad', 'cobol')]
-         eq_(sess.query(Engineer.name, Engineer.primary_language).all(),
-             expected)
-
-@@ -1184,12 +1184,12 @@
-         sess = create_session()
-
-         expected = [(
--            u'Elbonia, Inc.',
-+            'Elbonia, Inc.',
-             Engineer(
--                status=u'elbonian engineer',
--                engineer_name=u'vlad',
--                name=u'vlad',
--                primary_language=u'cobol'))]
-+                status='elbonian engineer',
-+                engineer_name='vlad',
-+                name='vlad',
-+                primary_language='cobol'))]
-         eq_(sess.query(Company.name, Person)
-                 .join(Company.employees)
-                 .filter(Company.name == 'Elbonia, Inc.').all(),
-@@ -1199,11 +1199,11 @@
-         sess = create_session()
-         expected = [(
-             Engineer(
--                status=u'elbonian engineer',
--                engineer_name=u'vlad',
--                name=u'vlad',
--                primary_language=u'cobol'),
--            u'Elbonia, Inc.')]
-+                status='elbonian engineer',
-+                engineer_name='vlad',
-+                name='vlad',
-+                primary_language='cobol'),
-+            'Elbonia, Inc.')]
-         eq_(sess.query(Person, Company.name)
-                 .join(Company.employees)
-                 .filter(Company.name == 'Elbonia, Inc.').all(),
-diff -r 9d0639b9d3be test/orm/inheritance/test_productspec.py
---- a/test/orm/inheritance/test_productspec.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/inheritance/test_productspec.py Sat Apr 27 19:42:17 2013 -0400
-@@ -122,8 +122,8 @@
-
-         a1 = session.query(Product).filter_by(name='a1').one()
-         new = repr(a1)
--        print orig
--        print new
-+        print(orig)
-+        print(new)
-         assert orig == new == '<Assembly a1> specification=[<SpecLine 1.0 <Product p1>>, <SpecLine 1.0 <Detail d1>>] documents=None'
-
-     def testtwo(self):
-@@ -153,8 +153,8 @@
-         session.flush()
-         session.expunge_all()
-         new = repr(session.query(SpecLine).all())
--        print orig
--        print new
-+        print(orig)
-+        print(new)
-         assert orig == new == '[<SpecLine 1.0 <Product p1>>, <SpecLine 1.0 <Detail d1>>]'
-
-     def testthree(self):
-@@ -206,8 +206,8 @@
-
-         a1 = session.query(Product).filter_by(name='a1').one()
-         new = repr(a1)
--        print orig
--        print new
-+        print(orig)
-+        print(new)
-         assert orig == new  == '<Assembly a1> specification=[<SpecLine 1.0 <Detail d1>>] documents=[<Document doc1>, <RasterDocument doc2>]'
-
-     def testfour(self):
-@@ -245,8 +245,8 @@
-
-         a1 = session.query(Product).filter_by(name='a1').one()
-         new = repr(a1)
--        print orig
--        print new
-+        print(orig)
-+        print(new)
-         assert orig == new  == '<Assembly a1> specification=None documents=[<RasterDocument doc2>]'
-
-         del a1.documents[0]
-@@ -312,7 +312,7 @@
-
-         a1 = session.query(Product).filter_by(name='a1').one()
-         new = repr(a1)
--        print orig
--        print new
-+        print(orig)
-+        print(new)
-         assert orig == new  == '<Assembly a1> specification=[<SpecLine 1.0 <Detail d1>>] documents=[<Document doc1>, <RasterDocument doc2>]'
-
-diff -r 9d0639b9d3be test/orm/inheritance/test_relationship.py
---- a/test/orm/inheritance/test_relationship.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/inheritance/test_relationship.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -287,7 +287,7 @@
-     def _five_obj_fixture(self):
-         sess = Session()
-         e1, e2, e3, e4, e5 = [
--            Engineer(name='e%d' % (i + 1)) for i in xrange(5)
-+            Engineer(name='e%d' % (i + 1)) for i in range(5)
-         ]
-         e3.reports_to = e1
-         e4.reports_to = e2
-diff -r 9d0639b9d3be test/orm/inheritance/test_with_poly.py
---- a/test/orm/inheritance/test_with_poly.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/inheritance/test_with_poly.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -11,7 +11,7 @@
- from sqlalchemy.testing.schema import Table, Column
- from sqlalchemy.testing import assert_raises, eq_
-
--from _poly_fixtures import Company, Person, Engineer, Manager, Boss, \
-+from ._poly_fixtures import Company, Person, Engineer, Manager, Boss, \
-     Machine, Paperwork, _PolymorphicFixtureBase, _Polymorphic,\
-     _PolymorphicPolymorphic, _PolymorphicUnions, _PolymorphicJoins,\
-     _PolymorphicAliasedJoins
-@@ -37,8 +37,8 @@
-                                 pa.Manager.manager_name=='dogbert')).\
-                 order_by(pa.Engineer.type).all(),
-             [
--                (u'dilbert', u'java', None),
--                (u'dogbert', None, u'dogbert'),
-+                ('dilbert', 'java', None),
-+                ('dogbert', None, 'dogbert'),
-             ]
-         )
-
-@@ -63,10 +63,10 @@
-                     )
-                 ).order_by(pa.name, pa_alias.name)],
-             [
--                (u'dilbert', Engineer, u'dilbert', Engineer),
--                (u'dogbert', Manager, u'pointy haired boss', Boss),
--                (u'vlad', Engineer, u'vlad', Engineer),
--                (u'wally', Engineer, u'wally', Engineer)
-+                ('dilbert', Engineer, 'dilbert', Engineer),
-+                ('dogbert', Manager, 'pointy haired boss', Boss),
-+                ('vlad', Engineer, 'vlad', Engineer),
-+                ('wally', Engineer, 'wally', Engineer)
-             ]
-         )
-
-@@ -91,10 +91,10 @@
-                     )
-                 ).order_by(pa.name, pa_alias.name)],
-             [
--                (u'dilbert', u'java', u'dilbert', u'java'),
--                (u'dogbert', None, u'pointy haired boss', None),
--                (u'vlad', u'cobol', u'vlad', u'cobol'),
--                (u'wally', u'c++', u'wally', u'c++')
-+                ('dilbert', 'java', 'dilbert', 'java'),
-+                ('dogbert', None, 'pointy haired boss', None),
-+                ('vlad', 'cobol', 'vlad', 'cobol'),
-+                ('wally', 'c++', 'wally', 'c++')
-             ]
-         )
-
-diff -r 9d0639b9d3be test/orm/test_assorted_eager.py
---- a/test/orm/test_assorted_eager.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_assorted_eager.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -129,7 +129,7 @@
-         # 3  "
-
-         # not orm style correct query
--        print "Obtaining correct results without orm"
-+        print("Obtaining correct results without orm")
-         result = sa.select(
-             [tests.c.id,categories.c.name],
-             sa.and_(tests.c.owner_id == 1,
-@@ -140,7 +140,7 @@
-                 tests.c.id == options.c.test_id,
-                 tests.c.owner_id == options.c.owner_id))]
-             ).execute().fetchall()
--        eq_(result, [(1, u'Some Category'), (3, u'Some Category')])
-+        eq_(result, [(1, 'Some Category'), (3, 'Some Category')])
-
-     def test_withoutjoinedload(self):
-         Thing, tests, options = (self.classes.Thing,
-@@ -158,7 +158,7 @@
-                                    options.c.someoption==False))))
-
-         result = ["%d %s" % ( t.id,t.category.name ) for t in l]
--        eq_(result, [u'1 Some Category', u'3 Some Category'])
-+        eq_(result, ['1 Some Category', '3 Some Category'])
-
-     def test_withjoinedload(self):
-         """
-@@ -185,7 +185,7 @@
-                                  options.c.someoption==False))))
-
-         result = ["%d %s" % ( t.id,t.category.name ) for t in l]
--        eq_(result, [u'1 Some Category', u'3 Some Category'])
-+        eq_(result, ['1 Some Category', '3 Some Category'])
-
-     def test_dslish(self):
-         """test the same as withjoinedload except using generative"""
-@@ -203,7 +203,7 @@
-             ).outerjoin('owner_option')
-
-         result = ["%d %s" % ( t.id,t.category.name ) for t in l]
--        eq_(result, [u'1 Some Category', u'3 Some Category'])
-+        eq_(result, ['1 Some Category', '3 Some Category'])
-
-     @testing.crashes('sybase', 'FIXME: unknown, verify not fails_on')
-     def test_without_outerjoin_literal(self):
-@@ -219,7 +219,7 @@
-              join('owner_option'))
-
-         result = ["%d %s" % ( t.id,t.category.name ) for t in l]
--        eq_(result, [u'3 Some Category'])
-+        eq_(result, ['3 Some Category'])
-
-     def test_withoutouterjoin(self):
-         Thing, tests, options = (self.classes.Thing,
-@@ -234,7 +234,7 @@
-                     ).join('owner_option')
-
-         result = ["%d %s" % ( t.id,t.category.name ) for t in l]
--        eq_(result, [u'3 Some Category'])
-+        eq_(result, ['3 Some Category'])
-
-
- class EagerTest2(fixtures.MappedTest):
-@@ -764,7 +764,7 @@
-                        (1,),),
-
-             task=(('title', 'task_type_id', 'status_id', 'prj_id'),
--                  (u'task 1', 1, 1, 1)))
-+                  ('task 1', 1, 1, 1)))
-
-     @classmethod
-     def setup_classes(cls):
-@@ -804,7 +804,7 @@
-         session = create_session()
-
-         eq_(session.query(Joined).limit(10).offset(0).one(),
--            Joined(id=1, title=u'task 1', props_cnt=0))
-+            Joined(id=1, title='task 1', props_cnt=0))
-
-
- class EagerTest9(fixtures.MappedTest):
-diff -r 9d0639b9d3be test/orm/test_attributes.py
---- a/test/orm/test_attributes.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_attributes.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -838,7 +838,7 @@
-             attributes.register_attribute(Foo, 'collection',
-                     uselist=True, typecallable=dict, useobject=True)
-             assert False
--        except sa_exc.ArgumentError, e:
-+        except sa_exc.ArgumentError as e:
-             assert str(e) \
-                 == 'Type InstrumentedDict must elect an appender '\
-                 'method to be a collection class'
-@@ -865,7 +865,7 @@
-             attributes.register_attribute(Foo, 'collection',
-                     uselist=True, typecallable=MyColl, useobject=True)
-             assert False
--        except sa_exc.ArgumentError, e:
-+        except sa_exc.ArgumentError as e:
-             assert str(e) \
-                 == 'Type MyColl must elect an appender method to be a '\
-                 'collection class'
-@@ -889,7 +889,7 @@
-         try:
-             Foo().collection
-             assert True
--        except sa_exc.ArgumentError, e:
-+        except sa_exc.ArgumentError as e:
-             assert False
-
- class GetNoValueTest(fixtures.ORMTest):
-@@ -1410,7 +1410,7 @@
-         class Foo(fixtures.BasicEntity):
-             pass
-         class Bar(fixtures.BasicEntity):
--            def __nonzero__(self):
-+            def __bool__(self):
-                 assert False
-
-         instrumentation.register_class(Foo)
-diff -r 9d0639b9d3be test/orm/test_collection.py
---- a/test/orm/test_collection.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_collection.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -1106,7 +1106,7 @@
-
-             @collection.converter
-             def _convert(self, dictlike):
--                for key, value in dictlike.iteritems():
-+                for key, value in dictlike.items():
-                     yield value + 5
-
-         class Foo(object):
-@@ -1145,12 +1145,12 @@
-             def __delitem__(self, key):
-                 del self.data[key]
-             def values(self):
--                return self.data.values()
-+                return list(self.data.values())
-             def __contains__(self, key):
-                 return key in self.data
-             @collection.iterator
-             def itervalues(self):
--                return self.data.itervalues()
-+                return iter(self.data.values())
-             __hash__ = object.__hash__
-             def __eq__(self, other):
-                 return self.data == other
-@@ -1158,7 +1158,7 @@
-                 return 'DictLike(%s)' % repr(self.data)
-
-         self._test_adapter(DictLike, self.dictable_entity,
--                           to_set=lambda c: set(c.itervalues()))
-+                           to_set=lambda c: set(c.values()))
-         self._test_dict(DictLike)
-         self._test_dict_bulk(DictLike)
-         self.assert_(getattr(DictLike, '_sa_instrumented') == id(DictLike))
-@@ -1185,12 +1185,12 @@
-             def __delitem__(self, key):
-                 del self.data[key]
-             def values(self):
--                return self.data.values()
-+                return list(self.data.values())
-             def __contains__(self, key):
-                 return key in self.data
-             @collection.iterator
-             def itervalues(self):
--                return self.data.itervalues()
-+                return iter(self.data.values())
-             __hash__ = object.__hash__
-             def __eq__(self, other):
-                 return self.data == other
-@@ -1198,7 +1198,7 @@
-                 return 'DictIsh(%s)' % repr(self.data)
-
-         self._test_adapter(DictIsh, self.dictable_entity,
--                           to_set=lambda c: set(c.itervalues()))
-+                           to_set=lambda c: set(c.values()))
-         self._test_dict(DictIsh)
-         self._test_dict_bulk(DictIsh)
-         self.assert_(getattr(DictIsh, '_sa_instrumented') == id(DictIsh))
-@@ -1859,7 +1859,7 @@
-         f = sess.query(Foo).get(f.col1)
-         assert len(list(f.bars)) == 2
-
--        existing = set([id(b) for b in f.bars.values()])
-+        existing = set([id(b) for b in list(f.bars.values())])
-
-         col = collections.collection_adapter(f.bars)
-         col.append_with_event(Bar('b'))
-@@ -1869,7 +1869,7 @@
-         f = sess.query(Foo).get(f.col1)
-         assert len(list(f.bars)) == 2
-
--        replaced = set([id(b) for b in f.bars.values()])
-+        replaced = set([id(b) for b in list(f.bars.values())])
-         self.assert_(existing != replaced)
-
-     def test_list(self):
-diff -r 9d0639b9d3be test/orm/test_composites.py
---- a/test/orm/test_composites.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_composites.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -510,11 +510,11 @@
-         session.commit()
-         eq_(
-             testing.db.execute(descriptions.select()).fetchall(),
--            [(1, u'Color', u'Number')]
-+            [(1, 'Color', 'Number')]
-         )
-         eq_(
-             testing.db.execute(values.select()).fetchall(),
--            [(1, 1, u'Red', u'5'), (2, 1, u'Blue', u'1')]
-+            [(1, 1, 'Red', '5'), (2, 1, 'Blue', '1')]
-         )
-
- class ManyToOneTest(fixtures.MappedTest):
-diff -r 9d0639b9d3be test/orm/test_deprecations.py
---- a/test/orm/test_deprecations.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_deprecations.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -122,7 +122,7 @@
-         session = sessionmaker(query_cls=MyQuery)()
-
-         ad1 = session.query(Address).get(1)
--        assert ad1 in cache.values()
-+        assert ad1 in list(cache.values())
-
-     def test_load(self):
-         """x = session.query(Address).load(1)
-diff -r 9d0639b9d3be test/orm/test_dynamic.py
---- a/test/orm/test_dynamic.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_dynamic.py Sat Apr 27 19:42:17 2013 -0400
-@@ -119,9 +119,9 @@
-         eq_(
-             list(u.addresses.order_by(desc(Address.email_address))),
-              [
--                Address(email_address=u'ed@wood.com'),
--                Address(email_address=u'ed@lala.com'),
--                Address(email_address=u'ed@bettyboop.com')
-+                Address(email_address='ed@wood.com'),
-+                Address(email_address='ed@lala.com'),
-+                Address(email_address='ed@bettyboop.com')
-             ]
-         )
-
-@@ -137,9 +137,9 @@
-         eq_(
-             list(u.addresses),
-             [
--                Address(email_address=u'ed@wood.com'),
--                Address(email_address=u'ed@lala.com'),
--                Address(email_address=u'ed@bettyboop.com')
-+                Address(email_address='ed@wood.com'),
-+                Address(email_address='ed@lala.com'),
-+                Address(email_address='ed@bettyboop.com')
-             ]
-         )
-
-@@ -147,9 +147,9 @@
-         eq_(
-             list(u.addresses.order_by(None).order_by(Address.email_address)),
-             [
--                Address(email_address=u'ed@bettyboop.com'),
--                Address(email_address=u'ed@lala.com'),
--                Address(email_address=u'ed@wood.com')
-+                Address(email_address='ed@bettyboop.com'),
-+                Address(email_address='ed@lala.com'),
-+                Address(email_address='ed@wood.com')
-             ]
-         )
-
-@@ -157,9 +157,9 @@
-         eq_(
-             set(u.addresses.order_by(None)),
-             set([
--                Address(email_address=u'ed@bettyboop.com'),
--                Address(email_address=u'ed@lala.com'),
--                Address(email_address=u'ed@wood.com')
-+                Address(email_address='ed@bettyboop.com'),
-+                Address(email_address='ed@lala.com'),
-+                Address(email_address='ed@wood.com')
-             ])
-         )
-
-@@ -529,12 +529,12 @@
-                 "SELECT addresses.id AS addresses_id, addresses.email_address "
-                 "AS addresses_email_address FROM addresses "
-                 "WHERE addresses.id = :param_1",
--                lambda ctx: [{u'param_1': a2_id}]
-+                lambda ctx: [{'param_1': a2_id}]
-             ),
-             CompiledSQL(
-                 "UPDATE addresses SET user_id=:user_id WHERE addresses.id = "
-                 ":addresses_id",
--                lambda ctx: [{u'addresses_id': a2_id, 'user_id': None}]
-+                lambda ctx: [{'addresses_id': a2_id, 'user_id': None}]
-             )
-         )
-
-diff -r 9d0639b9d3be test/orm/test_eager_relations.py
---- a/test/orm/test_eager_relations.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_eager_relations.py Sat Apr 27 19:42:17 2013 -0400
-@@ -747,11 +747,11 @@
-
-         sess = create_session()
-         eq_(sess.query(User).first(),
--            User(name=u'jack',orders=[
--                Order(address_id=1,description=u'order 1',isopen=0,user_id=7,id=1),
--                Order(address_id=1,description=u'order 3',isopen=1,user_id=7,id=3),
--                Order(address_id=None,description=u'order 5',isopen=0,user_id=7,id=5)],
--            email_address=u'jack@bean.com',id=7)
-+            User(name='jack',orders=[
-+                Order(address_id=1,description='order 1',isopen=0,user_id=7,id=1),
-+                Order(address_id=1,description='order 3',isopen=1,user_id=7,id=3),
-+                Order(address_id=None,description='order 5',isopen=0,user_id=7,id=5)],
-+            email_address='jack@bean.com',id=7)
-         )
-
-     def test_useget_cancels_eager(self):
-@@ -2131,15 +2131,15 @@
-         })
-
-         sess = create_session()
--        w1 = Widget(name=u'w1')
--        w2 = Widget(name=u'w2')
-+        w1 = Widget(name='w1')
-+        w2 = Widget(name='w2')
-         w1.children.append(w2)
-         sess.add(w1)
-         sess.flush()
-         sess.expunge_all()
-
-         eq_([Widget(name='w1', children=[Widget(name='w2')])],
--            sess.query(Widget).filter(Widget.name==u'w1').all())
-+            sess.query(Widget).filter(Widget.name=='w1').all())
-
- class MixedEntitiesTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
-     run_setup_mappers = 'once'
-@@ -2223,24 +2223,24 @@
-             eq_(
-                 [
-                     (
--                        User(addresses=[Address(email_address=u'fred@fred.com')], name=u'fred'),
--                        Order(description=u'order 2', isopen=0, items=[Item(description=u'item 1'), Item(description=u'item 2'), Item(description=u'item 3')]),
--                        User(addresses=[Address(email_address=u'jack@bean.com')], name=u'jack'),
--                        Order(description=u'order 3', isopen=1, items=[Item(description=u'item 3'), Item(description=u'item 4'), Item(description=u'item 5')])
-+                        User(addresses=[Address(email_address='fred@fred.com')], name='fred'),
-+                        Order(description='order 2', isopen=0, items=[Item(description='item 1'), Item(description='item 2'), Item(description='item 3')]),
-+                        User(addresses=[Address(email_address='jack@bean.com')], name='jack'),
-+                        Order(description='order 3', isopen=1, items=[Item(description='item 3'), Item(description='item 4'), Item(description='item 5')])
-                     ),
-
-                     (
--                        User(addresses=[Address(email_address=u'fred@fred.com')], name=u'fred'),
--                        Order(description=u'order 2', isopen=0, items=[Item(description=u'item 1'), Item(description=u'item 2'), Item(description=u'item 3')]),
--                        User(addresses=[Address(email_address=u'jack@bean.com')], name=u'jack'),
--                        Order(address_id=None, description=u'order 5', isopen=0, items=[Item(description=u'item 5')])
-+                        User(addresses=[Address(email_address='fred@fred.com')], name='fred'),
-+                        Order(description='order 2', isopen=0, items=[Item(description='item 1'), Item(description='item 2'), Item(description='item 3')]),
-+                        User(addresses=[Address(email_address='jack@bean.com')], name='jack'),
-+                        Order(address_id=None, description='order 5', isopen=0, items=[Item(description='item 5')])
-                     ),
-
-                     (
--                        User(addresses=[Address(email_address=u'fred@fred.com')], name=u'fred'),
--                        Order(description=u'order 4', isopen=1, items=[Item(description=u'item 1'), Item(description=u'item 5')]),
--                        User(addresses=[Address(email_address=u'jack@bean.com')], name=u'jack'),
--                        Order(address_id=None, description=u'order 5', isopen=0, items=[Item(description=u'item 5')])
-+                        User(addresses=[Address(email_address='fred@fred.com')], name='fred'),
-+                        Order(description='order 4', isopen=1, items=[Item(description='item 1'), Item(description='item 5')]),
-+                        User(addresses=[Address(email_address='jack@bean.com')], name='jack'),
-+                        Order(address_id=None, description='order 5', isopen=0, items=[Item(description='item 5')])
-                     ),
-                 ],
-                 sess.query(User, Order, u1, o1).\
-@@ -2651,9 +2651,9 @@
-         Movie = self.classes.Movie
-
-         session = Session(testing.db)
--        rscott = Director(name=u"Ridley Scott")
--        alien = Movie(title=u"Alien")
--        brunner = Movie(title=u"Blade Runner")
-+        rscott = Director(name="Ridley Scott")
-+        alien = Movie(title="Alien")
-+        brunner = Movie(title="Blade Runner")
-         rscott.movies.append(brunner)
-         rscott.movies.append(alien)
-         session.add_all([rscott, alien, brunner])
-diff -r 9d0639b9d3be test/orm/test_expire.py
---- a/test/orm/test_expire.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_expire.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -850,7 +850,7 @@
-         assert len(u.addresses) == 3
-         sess.expire(u)
-         assert 'addresses' not in u.__dict__
--        print "-------------------------------------------"
-+        print("-------------------------------------------")
-         sess.query(User).filter_by(id=8).all()
-         assert 'addresses' in u.__dict__
-         assert len(u.addresses) == 3
-diff -r 9d0639b9d3be test/orm/test_froms.py
---- a/test/orm/test_froms.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_froms.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -315,12 +315,12 @@
-                     from_self(User.name, ualias.name).
-                     order_by(User.name, ualias.name).all(),
-             [
--                (u'chuck', u'ed'),
--                (u'chuck', u'fred'),
--                (u'chuck', u'jack'),
--                (u'ed', u'jack'),
--                (u'fred', u'ed'),
--                (u'fred', u'jack')
-+                ('chuck', 'ed'),
-+                ('chuck', 'fred'),
-+                ('chuck', 'jack'),
-+                ('ed', 'jack'),
-+                ('fred', 'ed'),
-+                ('fred', 'jack')
-             ]
-         )
-
-@@ -330,7 +330,7 @@
-                     from_self(User.name, ualias.name).
-                     filter(ualias.name=='ed')\
-                 .order_by(User.name, ualias.name).all(),
--            [(u'chuck', u'ed'), (u'fred', u'ed')]
-+            [('chuck', 'ed'), ('fred', 'ed')]
-         )
-
-         eq_(
-@@ -340,11 +340,11 @@
-                     join(ualias.addresses).
-                     order_by(ualias.name, Address.email_address).all(),
-             [
--                (u'ed', u'fred@fred.com'),
--                (u'jack', u'ed@bettyboop.com'),
--                (u'jack', u'ed@lala.com'),
--                (u'jack', u'ed@wood.com'),
--                (u'jack', u'fred@fred.com')]
-+                ('ed', 'fred@fred.com'),
-+                ('jack', 'ed@bettyboop.com'),
-+                ('jack', 'ed@lala.com'),
-+                ('jack', 'ed@wood.com'),
-+                ('jack', 'fred@fred.com')]
-         )
-
-
-@@ -629,8 +629,8 @@
-             eq_(
-                 q.all(),
-                 [(
--                    A(bid=2, id=1, name=u'a1', type=u'a'),
--                    C(age=3, id=2, name=u'c1', type=u'c')
-+                    A(bid=2, id=1, name='a1', type='a'),
-+                    C(age=3, id=2, name='c1', type='c')
-                 )]
-             )
-
-@@ -642,8 +642,8 @@
-             eq_(
-                 q.all(),
-                 [(
--                    C(age=3, id=2, name=u'c1', type=u'c'),
--                    A(bid=2, id=1, name=u'a1', type=u'a')
-+                    C(age=3, id=2, name='c1', type='c'),
-+                    A(bid=2, id=1, name='a1', type='a')
-                 )]
-             )
-
-@@ -929,12 +929,12 @@
-                 # have a Dingaling here due to using the inner
-                 # join for the eager load
-                 [
--                    User(name=u'ed', addresses=[
--                        Address(email_address=u'ed@wood.com',
-+                    User(name='ed', addresses=[
-+                        Address(email_address='ed@wood.com',
-                                 dingaling=Dingaling(data='ding 1/2')),
-                     ]),
--                    User(name=u'fred', addresses=[
--                        Address(email_address=u'fred@fred.com',
-+                    User(name='fred', addresses=[
-+                        Address(email_address='fred@fred.com',
-                                 dingaling=Dingaling(data='ding 2/5'))
-                     ])
-                 ]
-@@ -965,12 +965,12 @@
-                 # have a Dingaling here due to using the inner
-                 # join for the eager load
-                 [
--                    User(name=u'ed', addresses=[
--                        Address(email_address=u'ed@wood.com',
-+                    User(name='ed', addresses=[
-+                        Address(email_address='ed@wood.com',
-                                 dingaling=Dingaling(data='ding 1/2')),
-                     ]),
--                    User(name=u'fred', addresses=[
--                        Address(email_address=u'fred@fred.com',
-+                    User(name='fred', addresses=[
-+                        Address(email_address='fred@fred.com',
-                                 dingaling=Dingaling(data='ding 2/5'))
-                     ])
-                 ]
-@@ -998,11 +998,11 @@
-                     contains_eager(User.orders)).order_by(User.id,
-                     Order.id).offset(1).limit(2).all()
-             eq_(l, [User(id=7,
--                addresses=[Address(email_address=u'jack@bean.com',
--                user_id=7, id=1)], name=u'jack',
-+                addresses=[Address(email_address='jack@bean.com',
-+                user_id=7, id=1)], name='jack',
-                 orders=[Order(address_id=1, user_id=7,
--                description=u'order 3', isopen=1, id=3),
--                Order(address_id=None, user_id=7, description=u'order 5'
-+                description='order 3', isopen=1, id=3),
-+                Order(address_id=None, user_id=7, description='order 5'
-                 , isopen=0, id=5)])])
-
-         self.assert_sql_count(testing.db, go, 1)
-@@ -1020,11 +1020,11 @@
-                                 order_by(User.id, oalias.id).\
-                                 offset(1).limit(2).all()
-             eq_(l, [User(id=7,
--                addresses=[Address(email_address=u'jack@bean.com',
--                user_id=7, id=1)], name=u'jack',
-+                addresses=[Address(email_address='jack@bean.com',
-+                user_id=7, id=1)], name='jack',
-                 orders=[Order(address_id=1, user_id=7,
--                description=u'order 3', isopen=1, id=3),
--                Order(address_id=None, user_id=7, description=u'order 5'
-+                description='order 3', isopen=1, id=3),
-+                Order(address_id=None, user_id=7, description='order 5'
-                 , isopen=0, id=5)])])
-
-         self.assert_sql_count(testing.db, go, 1)
-@@ -1045,15 +1045,15 @@
-         sel = users.select(User.id.in_([7, 8])).alias()
-         q = sess.query(User)
-         q2 = q.select_from(sel).values(User.name)
--        eq_(list(q2), [(u'jack',), (u'ed',)])
-+        eq_(list(q2), [('jack',), ('ed',)])
-
-         q = sess.query(User)
-         q2 = q.order_by(User.id).\
-                 values(User.name, User.name + " " + cast(User.id, String(50)))
-         eq_(
-             list(q2),
--            [(u'jack', u'jack 7'), (u'ed', u'ed 8'),
--            (u'fred', u'fred 9'), (u'chuck', u'chuck 10')]
-+            [('jack', 'jack 7'), ('ed', 'ed 8'),
-+            ('fred', 'fred 9'), ('chuck', 'chuck 10')]
-         )
-
-         q2 = q.join('addresses').\
-@@ -1061,27 +1061,27 @@
-                 order_by(User.id, Address.id).\
-                 values(User.name, Address.email_address)
-         eq_(list(q2),
--                [(u'ed', u'ed@wood.com'), (u'ed', u'ed@bettyboop.com'),
--                (u'ed', u'ed@lala.com'), (u'fred', u'fred@fred.com')])
-+                [('ed', 'ed@wood.com'), ('ed', 'ed@bettyboop.com'),
-+                ('ed', 'ed@lala.com'), ('fred', 'fred@fred.com')])
-
-         q2 = q.join('addresses').\
-                 filter(User.name.like('%e%')).\
-                 order_by(desc(Address.email_address)).\
-                 slice(1, 3).values(User.name, Address.email_address)
--        eq_(list(q2), [(u'ed', u'ed@wood.com'), (u'ed', u'ed@lala.com')])
-+        eq_(list(q2), [('ed', 'ed@wood.com'), ('ed', 'ed@lala.com')])
-
-         adalias = aliased(Address)
-         q2 = q.join(adalias, 'addresses').\
-                 filter(User.name.like('%e%')).order_by(adalias.email_address).\
-                 values(User.name, adalias.email_address)
--        eq_(list(q2), [(u'ed', u'ed@bettyboop.com'), (u'ed', u'ed@lala.com'),
--                       (u'ed', u'ed@wood.com'), (u'fred', u'fred@fred.com')])
-+        eq_(list(q2), [('ed', 'ed@bettyboop.com'), ('ed', 'ed@lala.com'),
-+                       ('ed', 'ed@wood.com'), ('fred', 'fred@fred.com')])
-
-         q2 = q.values(func.count(User.name))
--        assert q2.next() == (4,)
-+        assert next(q2) == (4,)
-
-         q2 = q.select_from(sel).filter(User.id==8).values(User.name, sel.c.name, User.name)
--        eq_(list(q2), [(u'ed', u'ed', u'ed')])
-+        eq_(list(q2), [('ed', 'ed', 'ed')])
-
-         # using User.xxx is alised against "sel", so this query returns nothing
-         q2 = q.select_from(sel).\
-@@ -1093,7 +1093,7 @@
-         q2 = q.select_from(sel).\
-                 filter(users.c.id==8).\
-                 filter(users.c.id>sel.c.id).values(users.c.name, sel.c.name, User.name)
--        eq_(list(q2), [(u'ed', u'jack', u'jack')])
-+        eq_(list(q2), [('ed', 'jack', 'jack')])
-
-     def test_alias_naming(self):
-         User = self.classes.User
-@@ -1123,10 +1123,10 @@
-                     filter(u2.id>1).\
-                     order_by(User.id, sel.c.id, u2.id).\
-                     values(User.name, sel.c.name, u2.name)
--        eq_(list(q2), [(u'jack', u'jack', u'jack'), (u'jack', u'jack', u'ed'),
--                        (u'jack', u'jack', u'fred'), (u'jack', u'jack', u'chuck'),
--                        (u'ed', u'ed', u'jack'), (u'ed', u'ed', u'ed'),
--                        (u'ed', u'ed', u'fred'), (u'ed', u'ed', u'chuck')])
-+        eq_(list(q2), [('jack', 'jack', 'jack'), ('jack', 'jack', 'ed'),
-+                        ('jack', 'jack', 'fred'), ('jack', 'jack', 'chuck'),
-+                        ('ed', 'ed', 'jack'), ('ed', 'ed', 'ed'),
-+                        ('ed', 'ed', 'fred'), ('ed', 'ed', 'chuck')])
-
-     @testing.fails_on('mssql', 'FIXME: unknown')
-     @testing.fails_on('oracle',
-@@ -1177,8 +1177,8 @@
-         # we don't want Address to be outside of the subquery here
-         eq_(
-             list(sess.query(User, subq)[0:3]),
--            [(User(id=7,name=u'jack'), 1), (User(id=8,name=u'ed'), 3),
--            (User(id=9,name=u'fred'), 1)]
-+            [(User(id=7,name='jack'), 1), (User(id=8,name='ed'), 3),
-+            (User(id=9,name='fred'), 1)]
-             )
-
-         # same thing without the correlate, as it should
-@@ -1190,8 +1190,8 @@
-         # we don't want Address to be outside of the subquery here
-         eq_(
-             list(sess.query(User, subq)[0:3]),
--            [(User(id=7,name=u'jack'), 1), (User(id=8,name=u'ed'), 3),
--            (User(id=9,name=u'fred'), 1)]
-+            [(User(id=7,name='jack'), 1), (User(id=8,name='ed'), 3),
-+            (User(id=9,name='fred'), 1)]
-             )
-
-
-@@ -1202,23 +1202,23 @@
-
-         sess = create_session()
-
--        eq_(sess.query(User.name).all(), [(u'jack',), (u'ed',), (u'fred',), (u'chuck',)])
-+        eq_(sess.query(User.name).all(), [('jack',), ('ed',), ('fred',), ('chuck',)])
-
-         sel = users.select(User.id.in_([7, 8])).alias()
-         q = sess.query(User.name)
-         q2 = q.select_from(sel).all()
--        eq_(list(q2), [(u'jack',), (u'ed',)])
-+        eq_(list(q2), [('jack',), ('ed',)])
-
-         eq_(sess.query(User.name, Address.email_address).filter(User.id==Address.user_id).all(), [
--            (u'jack', u'jack@bean.com'), (u'ed', u'ed@wood.com'),
--            (u'ed', u'ed@bettyboop.com'), (u'ed', u'ed@lala.com'),
--            (u'fred', u'fred@fred.com')
-+            ('jack', 'jack@bean.com'), ('ed', 'ed@wood.com'),
-+            ('ed', 'ed@bettyboop.com'), ('ed', 'ed@lala.com'),
-+            ('fred', 'fred@fred.com')
-         ])
-
-         eq_(sess.query(User.name, func.count(Address.email_address)).\
-                     outerjoin(User.addresses).group_by(User.id, User.name).\
-                     order_by(User.id).all(),
--            [(u'jack', 1), (u'ed', 3), (u'fred', 1), (u'chuck', 0)]
-+            [('jack', 1), ('ed', 3), ('fred', 1), ('chuck', 0)]
-         )
-
-         eq_(sess.query(User, func.count(Address.email_address)).\
-@@ -1246,8 +1246,8 @@
-         eq_(sess.query(func.count(adalias.email_address), User).\
-                 outerjoin(adalias, User.addresses).group_by(User).\
-                 order_by(User.id).all(),
--            [(1, User(name=u'jack',id=7)), (3, User(name=u'ed',id=8)),
--                (1, User(name=u'fred',id=9)), (0, User(name=u'chuck',id=10))]
-+            [(1, User(name='jack',id=7)), (3, User(name='ed',id=8)),
-+                (1, User(name='fred',id=9)), (0, User(name='chuck',id=10))]
-         )
-
-         # select from aliasing + explicit aliasing
-@@ -1257,12 +1257,12 @@
-                     from_self(User, adalias.email_address).\
-                     order_by(User.id, adalias.id).all(),
-             [
--                (User(name=u'jack',id=7), u'jack@bean.com'),
--                (User(name=u'ed',id=8), u'ed@wood.com'),
--                (User(name=u'ed',id=8), u'ed@bettyboop.com'),
--                (User(name=u'ed',id=8), u'ed@lala.com'),
--                (User(name=u'fred',id=9), u'fred@fred.com'),
--                (User(name=u'chuck',id=10), None)
-+                (User(name='jack',id=7), 'jack@bean.com'),
-+                (User(name='ed',id=8), 'ed@wood.com'),
-+                (User(name='ed',id=8), 'ed@bettyboop.com'),
-+                (User(name='ed',id=8), 'ed@lala.com'),
-+                (User(name='fred',id=9), 'fred@fred.com'),
-+                (User(name='chuck',id=10), None)
-             ]
-         )
-
-@@ -1272,8 +1272,8 @@
-                     filter(Address.email_address.like('%ed%')).\
-                     from_self().all(),
-             [
--                User(name=u'ed',id=8),
--                User(name=u'fred',id=9),
-+                User(name='ed',id=8),
-+                User(name='fred',id=9),
-             ]
-         )
-
-@@ -1293,27 +1293,27 @@
-
-                 q.all(),
-                 [(User(addresses=[
--                            Address(user_id=7,email_address=u'jack@bean.com',id=1)],
--                            name=u'jack',id=7), u'jack@bean.com'),
-+                            Address(user_id=7,email_address='jack@bean.com',id=1)],
-+                            name='jack',id=7), 'jack@bean.com'),
-                 (User(addresses=[
--                                    Address(user_id=8,email_address=u'ed@wood.com',id=2),
--                                    Address(user_id=8,email_address=u'ed@bettyboop.com',id=3),
--                                    Address(user_id=8,email_address=u'ed@lala.com',id=4)],
--                                        name=u'ed',id=8), u'ed@wood.com'),
-+                                    Address(user_id=8,email_address='ed@wood.com',id=2),
-+                                    Address(user_id=8,email_address='ed@bettyboop.com',id=3),
-+                                    Address(user_id=8,email_address='ed@lala.com',id=4)],
-+                                        name='ed',id=8), 'ed@wood.com'),
-                 (User(addresses=[
--                            Address(user_id=8,email_address=u'ed@wood.com',id=2),
--                            Address(user_id=8,email_address=u'ed@bettyboop.com',id=3),
--                            Address(user_id=8,email_address=u'ed@lala.com',id=4)],name=u'ed',id=8),
--                                        u'ed@bettyboop.com'),
-+                            Address(user_id=8,email_address='ed@wood.com',id=2),
-+                            Address(user_id=8,email_address='ed@bettyboop.com',id=3),
-+                            Address(user_id=8,email_address='ed@lala.com',id=4)],name='ed',id=8),
-+                                        'ed@bettyboop.com'),
-                 (User(addresses=[
--                            Address(user_id=8,email_address=u'ed@wood.com',id=2),
--                            Address(user_id=8,email_address=u'ed@bettyboop.com',id=3),
--                            Address(user_id=8,email_address=u'ed@lala.com',id=4)],name=u'ed',id=8),
--                                        u'ed@lala.com'),
--                (User(addresses=[Address(user_id=9,email_address=u'fred@fred.com',id=5)],name=u'fred',id=9),
--                                        u'fred@fred.com'),
-+                            Address(user_id=8,email_address='ed@wood.com',id=2),
-+                            Address(user_id=8,email_address='ed@bettyboop.com',id=3),
-+                            Address(user_id=8,email_address='ed@lala.com',id=4)],name='ed',id=8),
-+                                        'ed@lala.com'),
-+                (User(addresses=[Address(user_id=9,email_address='fred@fred.com',id=5)],name='fred',id=9),
-+                                        'fred@fred.com'),
-
--                (User(addresses=[],name=u'chuck',id=10), None)]
-+                (User(addresses=[],name='chuck',id=10), None)]
-         )
-
-     def test_column_from_limited_joinedload(self):
-@@ -1367,19 +1367,19 @@
-             eq_(
-             q.all(),
-             [
--                (Order(address_id=1,description=u'order 3',isopen=1,user_id=7,id=3),
--                        Order(address_id=1,description=u'order 1',isopen=0,user_id=7,id=1)),
--                (Order(address_id=None,description=u'order 5',isopen=0,user_id=7,id=5),
--                        Order(address_id=1,description=u'order 1',isopen=0,user_id=7,id=1)),
--                (Order(address_id=None,description=u'order 5',isopen=0,user_id=7,id=5),
--                        Order(address_id=1,description=u'order 3',isopen=1,user_id=7,id=3))
-+                (Order(address_id=1,description='order 3',isopen=1,user_id=7,id=3),
-+                        Order(address_id=1,description='order 1',isopen=0,user_id=7,id=1)),
-+                (Order(address_id=None,description='order 5',isopen=0,user_id=7,id=5),
-+                        Order(address_id=1,description='order 1',isopen=0,user_id=7,id=1)),
-+                (Order(address_id=None,description='order 5',isopen=0,user_id=7,id=5),
-+                        Order(address_id=1,description='order 3',isopen=1,user_id=7,id=3))
-             ]
-         )
-
-
-         # ensure column expressions are taken from inside the subquery, not restated at the top
-         q = sess.query(Order.id, Order.description, literal_column("'q'").label('foo')).\
--            filter(Order.description == u'order 3').from_self()
-+            filter(Order.description == 'order 3').from_self()
-         self.assert_compile(q,
-                             "SELECT anon_1.orders_id AS "
-                             "anon_1_orders_id, anon_1.orders_descriptio"
-@@ -1392,7 +1392,7 @@
-                             "anon_1")
-         eq_(
-             q.all(),
--            [(3, u'order 3', 'q')]
-+            [(3, 'order 3', 'q')]
-         )
-
-
-@@ -1518,7 +1518,7 @@
-
-         eq_(
-             sess.query(User.id).add_column(users).all(),
--            [(7, 7, u'jack'), (8, 8, u'ed'), (9, 9, u'fred'), (10, 10, u'chuck')]
-+            [(7, 7, 'jack'), (8, 8, 'ed'), (9, 9, 'fred'), (10, 10, 'chuck')]
-         )
-
-     def test_multi_columns_2(self):
-@@ -1936,7 +1936,7 @@
-                 filter(Keyword.name.in_(['red', 'big', 'round'])).\
-                 all(),
-         [
--            User(name=u'jack',id=7)
-+            User(name='jack',id=7)
-         ])
-
-         eq_(sess.query(User).select_from(sel).\
-@@ -1944,7 +1944,7 @@
-                     filter(Keyword.name.in_(['red', 'big', 'round'])).\
-                     all(),
-         [
--            User(name=u'jack',id=7)
-+            User(name='jack',id=7)
-         ])
-
-         def go():
-@@ -1955,39 +1955,39 @@
-                         filter(Keyword.name.in_(['red', 'big', 'round'])).\
-                         all(),
-                 [
--                User(name=u'jack',orders=[
--                    Order(description=u'order 1',items=[
--                        Item(description=u'item 1',
-+                User(name='jack',orders=[
-+                    Order(description='order 1',items=[
-+                        Item(description='item 1',
-                             keywords=[
--                                Keyword(name=u'red'),
--                                Keyword(name=u'big'),
--                                Keyword(name=u'round')
-+                                Keyword(name='red'),
-+                                Keyword(name='big'),
-+                                Keyword(name='round')
-                             ]),
--                        Item(description=u'item 2',
-+                        Item(description='item 2',
-                             keywords=[
--                                Keyword(name=u'red',id=2),
--                                Keyword(name=u'small',id=5),
--                                Keyword(name=u'square')
-+                                Keyword(name='red',id=2),
-+                                Keyword(name='small',id=5),
-+                                Keyword(name='square')
-                             ]),
--                        Item(description=u'item 3',
-+                        Item(description='item 3',
-                                 keywords=[
--                                    Keyword(name=u'green',id=3),
--                                    Keyword(name=u'big',id=4),
--                                    Keyword(name=u'round',id=6)])
-+                                    Keyword(name='green',id=3),
-+                                    Keyword(name='big',id=4),
-+                                    Keyword(name='round',id=6)])
-                     ]),
--                    Order(description=u'order 3',items=[
--                        Item(description=u'item 3',
-+                    Order(description='order 3',items=[
-+                        Item(description='item 3',
-                                 keywords=[
--                                    Keyword(name=u'green',id=3),
--                                    Keyword(name=u'big',id=4),
--                                    Keyword(name=u'round',id=6)
-+                                    Keyword(name='green',id=3),
-+                                    Keyword(name='big',id=4),
-+                                    Keyword(name='round',id=6)
-                                 ]),
--                        Item(description=u'item 4',keywords=[],id=4),
--                        Item(description=u'item 5',keywords=[],id=5)
-+                        Item(description='item 4',keywords=[],id=4),
-+                        Item(description='item 5',keywords=[],id=5)
-                         ]),
--                    Order(description=u'order 5',
-+                    Order(description='order 5',
-                         items=[
--                            Item(description=u'item 5',keywords=[])])
-+                            Item(description='item 5',keywords=[])])
-                         ])
-                 ])
-         self.assert_sql_count(testing.db, go, 1)
-@@ -1998,15 +1998,15 @@
-                     join('items', 'keywords').\
-                     filter(Keyword.name == 'red').\
-                     order_by(Order.id).all(), [
--            Order(description=u'order 1',id=1),
--            Order(description=u'order 2',id=2),
-+            Order(description='order 1',id=1),
-+            Order(description='order 2',id=2),
-         ])
-         eq_(sess.query(Order).select_from(sel2).\
-                     join('items', 'keywords', aliased=True).\
-                     filter(Keyword.name == 'red').\
-                     order_by(Order.id).all(), [
--            Order(description=u'order 1',id=1),
--            Order(description=u'order 2',id=2),
-+            Order(description='order 1',id=1),
-+            Order(description='order 2',id=2),
-         ])
-
-
-diff -r 9d0639b9d3be test/orm/test_generative.py
---- a/test/orm/test_generative.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_generative.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -78,13 +78,14 @@
-         assert sess.query(func.min(foo.c.bar)).filter(foo.c.bar<30).one() == (0,)
-
-         assert sess.query(func.max(foo.c.bar)).filter(foo.c.bar<30).one() == (29,)
--        # Py3K
--        #assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).__next__()[0] == 29
--        #assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).__next__()[0] == 29
--        # Py2K
--        assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).next()[0] == 29
--        assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).next()[0] == 29
--        # end Py2K
-+# start Py3K
-+        assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).__next__()[0] == 29
-+        assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).__next__()[0] == 29
-+# end Py3K
-+# start Py2K
-+#        assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).next()[0] == 29
-+#        assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).next()[0] == 29
-+# end Py2K
-
-     @testing.fails_if(lambda:testing.against('mysql+mysqldb') and
-             testing.db.dialect.dbapi.version_info[:4] == (1, 2, 1, 'gamma'),
-@@ -111,18 +112,20 @@
-
-         query = create_session().query(Foo)
-
--        # Py3K
--        #avg_f = query.filter(foo.c.bar<30).values(sa.func.avg(foo.c.bar)).__next__()[0]
--        # Py2K
--        avg_f = query.filter(foo.c.bar<30).values(sa.func.avg(foo.c.bar)).next()[0]
--        # end Py2K
-+# start Py3K
-+        avg_f = query.filter(foo.c.bar<30).values(sa.func.avg(foo.c.bar)).__next__()[0]
-+# end Py3K
-+# start Py2K
-+#        avg_f = query.filter(foo.c.bar<30).values(sa.func.avg(foo.c.bar)).next()[0]
-+# end Py2K
-         assert float(round(avg_f, 1)) == 14.5
-
--        # Py3K
--        #avg_o = query.filter(foo.c.bar<30).values(sa.func.avg(foo.c.bar)).__next__()[0]
--        # Py2K
--        avg_o = query.filter(foo.c.bar<30).values(sa.func.avg(foo.c.bar)).next()[0]
--        # end Py2K
-+# start Py3K
-+        avg_o = query.filter(foo.c.bar<30).values(sa.func.avg(foo.c.bar)).__next__()[0]
-+# end Py3K
-+# start Py2K
-+#        avg_o = query.filter(foo.c.bar<30).values(sa.func.avg(foo.c.bar)).next()[0]
-+# end Py2K
-         assert float(round(avg_o, 1)) == 14.5
-
-     def test_filter(self):
-diff -r 9d0639b9d3be test/orm/test_inspect.py
---- a/test/orm/test_inspect.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_inspect.py Sat Apr 27 19:42:17 2013 -0400
-@@ -142,7 +142,7 @@
-             [insp.get_property('id'), insp.get_property('name')]
-         )
-         eq_(
--            insp.column_attrs.keys(),
-+            list(insp.column_attrs.keys()),
-             ['id', 'name']
-         )
-         is_(
-@@ -274,7 +274,7 @@
-         insp = inspect(SomeSubClass)
-         eq_(
-             dict((k, v.extension_type)
--                for k, v in insp.all_orm_descriptors.items()
-+                for k, v in list(insp.all_orm_descriptors.items())
-             ),
-             {
-                 'id': NOT_EXTENSION,
-diff -r 9d0639b9d3be test/orm/test_instrumentation.py
---- a/test/orm/test_instrumentation.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_instrumentation.py Sat Apr 27 19:42:17 2013 -0400
-@@ -522,30 +522,31 @@
- class Py3KFunctionInstTest(fixtures.ORMTest):
-     __requires__ = ("python3", )
-
--    # Py3K
--    #def _kw_only_fixture(self):
--    #    class A(object):
--    #        def __init__(self, a, *, b, c):
--    #            self.a = a
--    #            self.b = b
--    #            self.c = c
--    #    return self._instrument(A)
--    #
--    #def _kw_plus_posn_fixture(self):
--    #    class A(object):
--    #        def __init__(self, a, *args, b, c):
--    #            self.a = a
--    #            self.b = b
--    #            self.c = c
--    #    return self._instrument(A)
--    #
--    #def _kw_opt_fixture(self):
--    #    class A(object):
--    #        def __init__(self, a, *, b, c="c"):
--    #            self.a = a
--    #            self.b = b
--    #            self.c = c
--    #    return self._instrument(A)
-+# start Py3K
-+    def _kw_only_fixture(self):
-+        class A(object):
-+            def __init__(self, a, *, b, c):
-+                self.a = a
-+                self.b = b
-+                self.c = c
-+        return self._instrument(A)
-+
-+    def _kw_plus_posn_fixture(self):
-+        class A(object):
-+            def __init__(self, a, *args, b, c):
-+                self.a = a
-+                self.b = b
-+                self.c = c
-+        return self._instrument(A)
-+
-+    def _kw_opt_fixture(self):
-+        class A(object):
-+            def __init__(self, a, *, b, c="c"):
-+                self.a = a
-+                self.b = b
-+                self.c = c
-+        return self._instrument(A)
-+# end Py3K
-
-     def _instrument(self, cls):
-         manager = instrumentation.register_class(cls)
-diff -r 9d0639b9d3be test/orm/test_joins.py
---- a/test/orm/test_joins.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_joins.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -774,14 +774,14 @@
-         eq_(
-             sess.query(User).join(Address.user).\
-                             filter(Address.email_address=='ed@wood.com').all(),
--            [User(id=8,name=u'ed')]
-+            [User(id=8,name='ed')]
-         )
-
-         # its actually not so controversial if you view it in terms
-         # of multiple entities.
-         eq_(
-             sess.query(User, Address).join(Address.user).filter(Address.email_address=='ed@wood.com').all(),
--            [(User(id=8,name=u'ed'), Address(email_address='ed@wood.com'))]
-+            [(User(id=8,name='ed'), Address(email_address='ed@wood.com'))]
-         )
-
-         # this was the controversial part.  now, raise an error if the feature is abused.
-@@ -1162,9 +1162,9 @@
-             sess.query(OrderAlias).join('items').filter_by(description='item 3').\
-                 order_by(OrderAlias.id).all(),
-             [
--                Order(address_id=1,description=u'order 1',isopen=0,user_id=7,id=1),
--                Order(address_id=4,description=u'order 2',isopen=0,user_id=9,id=2),
--                Order(address_id=1,description=u'order 3',isopen=1,user_id=7,id=3)
-+                Order(address_id=1,description='order 1',isopen=0,user_id=7,id=1),
-+                Order(address_id=4,description='order 2',isopen=0,user_id=9,id=2),
-+                Order(address_id=1,description='order 3',isopen=1,user_id=7,id=3)
-             ]
-         )
-
-@@ -1175,9 +1175,9 @@
-                         filter_by(description='item 3').\
-                 order_by(User.id, OrderAlias.id).all(),
-             [
--                (User(name=u'jack',id=7), Order(address_id=1,description=u'order 1',isopen=0,user_id=7,id=1), u'item 3'),
--                (User(name=u'jack',id=7), Order(address_id=1,description=u'order 3',isopen=1,user_id=7,id=3), u'item 3'),
--                (User(name=u'fred',id=9), Order(address_id=4,description=u'order 2',isopen=0,user_id=9,id=2), u'item 3')
-+                (User(name='jack',id=7), Order(address_id=1,description='order 1',isopen=0,user_id=7,id=1), 'item 3'),
-+                (User(name='jack',id=7), Order(address_id=1,description='order 3',isopen=1,user_id=7,id=3), 'item 3'),
-+                (User(name='fred',id=9), Order(address_id=4,description='order 2',isopen=0,user_id=9,id=2), 'item 3')
-             ]
-         )
-
-@@ -1334,12 +1334,12 @@
-         eq_(
-             sess.query(User, ualias).filter(User.id > ualias.id).order_by(desc(ualias.id), User.name).all(),
-             [
--                (User(id=10,name=u'chuck'), User(id=9,name=u'fred')),
--                (User(id=10,name=u'chuck'), User(id=8,name=u'ed')),
--                (User(id=9,name=u'fred'), User(id=8,name=u'ed')),
--                (User(id=10,name=u'chuck'), User(id=7,name=u'jack')),
--                (User(id=8,name=u'ed'), User(id=7,name=u'jack')),
--                (User(id=9,name=u'fred'), User(id=7,name=u'jack'))
-+                (User(id=10,name='chuck'), User(id=9,name='fred')),
-+                (User(id=10,name='chuck'), User(id=8,name='ed')),
-+                (User(id=9,name='fred'), User(id=8,name='ed')),
-+                (User(id=10,name='chuck'), User(id=7,name='jack')),
-+                (User(id=8,name='ed'), User(id=7,name='jack')),
-+                (User(id=9,name='fred'), User(id=7,name='jack'))
-             ]
-         )
-
-@@ -1351,7 +1351,7 @@
-
-         eq_(
-             sess.query(User.name).join(addresses, User.id==addresses.c.user_id).order_by(User.id).all(),
--            [(u'jack',), (u'ed',), (u'ed',), (u'ed',), (u'fred',)]
-+            [('jack',), ('ed',), ('ed',), ('ed',), ('fred',)]
-         )
-
-     def test_no_joinpoint_expr(self):
-@@ -2066,13 +2066,13 @@
-         # using 'n1.parent' implicitly joins to unaliased Node
-         eq_(
-             sess.query(n1).join(n1.parent).filter(Node.data=='n1').all(),
--            [Node(parent_id=1,data=u'n11',id=2), Node(parent_id=1,data=u'n12',id=3), Node(parent_id=1,data=u'n13',id=4)]
-+            [Node(parent_id=1,data='n11',id=2), Node(parent_id=1,data='n12',id=3), Node(parent_id=1,data='n13',id=4)]
-         )
-
-         # explicit (new syntax)
-         eq_(
-             sess.query(n1).join(Node, n1.parent).filter(Node.data=='n1').all(),
--            [Node(parent_id=1,data=u'n11',id=2), Node(parent_id=1,data=u'n12',id=3), Node(parent_id=1,data=u'n13',id=4)]
-+            [Node(parent_id=1,data='n11',id=2), Node(parent_id=1,data='n12',id=3), Node(parent_id=1,data='n13',id=4)]
-         )
-
-
-diff -r 9d0639b9d3be test/orm/test_loading.py
---- a/test/orm/test_loading.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_loading.py Sat Apr 27 19:42:17 2013 -0400
-@@ -73,7 +73,7 @@
-             [(x.id, y) for x, y in it],
-             [(1, 1), (2, 2), (7, 7), (8, 8)]
-         )
--        eq_(it[0].keys(), ['User', 'id'])
-+        eq_(list(it[0].keys()), ['User', 'id'])
-
-     def test_entity_col_mix_keyed_tuple(self):
-         s, (u1, u2, u3, u4) = self._fixture()
-@@ -91,7 +91,7 @@
-             [(x.id, y) for x, y in it],
-             [(1, 1), (2, 2), (7, 7), (8, 8)]
-         )
--        eq_(it[0].keys(), ['User', 'id'])
-+        eq_(list(it[0].keys()), ['User', 'id'])
-
-     def test_none_entity(self):
-         s, (u1, u2, u3, u4) = self._fixture()
-diff -r 9d0639b9d3be test/orm/test_mapper.py
---- a/test/orm/test_mapper.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_mapper.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -272,13 +272,14 @@
-                     )
-         m = mapper(Foo, foo_t)
-         class DontCompareMeToString(int):
--        # Py3K
--        #    pass
--        # Py2K
--            def __lt__(self, other):
--                assert not isinstance(other, basestring)
--                return int(self) < other
--        # end Py2K
-+# start Py3K
-+            pass
-+# end Py3K
-+# start Py2K
-+#            def __lt__(self, other):
-+#                assert not isinstance(other, basestring)
-+#                return int(self) < other
-+# end Py2K
-         foos = [Foo(id='f%d' % i) for i in range(5)]
-         states = [attributes.instance_state(f) for f in foos]
-
-@@ -847,7 +848,7 @@
-
-     def test_we_dont_call_bool(self):
-         class NoBoolAllowed(object):
--            def __nonzero__(self):
-+            def __bool__(self):
-                 raise Exception("nope")
-         mapper(NoBoolAllowed, self.tables.users)
-         u1 = NoBoolAllowed()
-@@ -1057,12 +1058,12 @@
-
-         eq_(
-             create_session().query(User).all(),
--            [User(id=7, name=u'jack'), User(id=9, name=u'fred'), User(id=8, name=u'ed'), User(id=10, name=u'chuck')]
-+            [User(id=7, name='jack'), User(id=9, name='fred'), User(id=8, name='ed'), User(id=10, name='chuck')]
-         )
-
-         eq_(
-             create_session().query(User).order_by(User.name).all(),
--            [User(id=10, name=u'chuck'), User(id=8, name=u'ed'), User(id=9, name=u'fred'), User(id=7, name=u'jack')]
-+            [User(id=10, name='chuck'), User(id=8, name='ed'), User(id=9, name='fred'), User(id=7, name='jack')]
-         )
-
-     # 'Raises a "expression evaluation not supported" error at prepare time
-@@ -2123,7 +2124,7 @@
-         mapper(Address, addresses)
-
-         eq_(
--            dict((k, v[0].__name__) for k, v in u_m.validators.items()),
-+            dict((k, v[0].__name__) for k, v in list(u_m.validators.items())),
-             {'name':'validate_name',
-             'addresses':'validate_address'}
-         )
-@@ -2992,29 +2993,29 @@
-               Column('ht1b_id', Integer, ForeignKey('ht1.id'), primary_key=True),
-               Column('value', String(10)))
-
--    # Py2K
--    def test_baseclass(self):
--        ht1 = self.tables.ht1
--
--        class OldStyle:
--            pass
--
--        assert_raises(sa.exc.ArgumentError, mapper, OldStyle, ht1)
--
--        assert_raises(sa.exc.ArgumentError, mapper, 123)
--
--        class NoWeakrefSupport(str):
--            pass
--
--        # TODO: is weakref support detectable without an instance?
--        #self.assertRaises(sa.exc.ArgumentError, mapper, NoWeakrefSupport, t2)
--    # end Py2K
-+# start Py2K
-+#    def test_baseclass(self):
-+#        ht1 = self.tables.ht1
-+#
-+#        class OldStyle:
-+#            pass
-+#
-+#        assert_raises(sa.exc.ArgumentError, mapper, OldStyle, ht1)
-+#
-+#        assert_raises(sa.exc.ArgumentError, mapper, 123)
-+#
-+#        class NoWeakrefSupport(str):
-+#            pass
-+#
-+#        # TODO: is weakref support detectable without an instance?
-+#        #self.assertRaises(sa.exc.ArgumentError, mapper, NoWeakrefSupport, t2)
-+# end Py2K
-
-     class _ValueBase(object):
-         def __init__(self, value='abc', id=None):
-             self.id = id
-             self.value = value
--        def __nonzero__(self):
-+        def __bool__(self):
-             return False
-         def __hash__(self):
-             return hash(self.value)
-@@ -3173,7 +3174,7 @@
-                 return self.value
-
-         class H2(object):
--            def __nonzero__(self):
-+            def __bool__(self):
-                 return bool(self.get_value())
-
-             def get_value(self):
-@@ -3224,7 +3225,7 @@
-         self._test("someprop")
-
-     def test_unicode(self):
--        self._test(u"someprop")
-+        self._test("someprop")
-
-     def test_int(self):
-         self._test(5)
-diff -r 9d0639b9d3be test/orm/test_merge.py
---- a/test/orm/test_merge.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_merge.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -346,7 +346,7 @@
-         sess = create_session()
-         sess.merge(u1)
-         sess.flush()
--        assert u1.addresses.keys() == ['foo@bar.com']
-+        assert list(u1.addresses.keys()) == ['foo@bar.com']
-
-     def test_attribute_cascade(self):
-         """Merge of a persistent entity with two child
-@@ -803,7 +803,7 @@
-         try:
-             sess2.merge(u, load=False)
-             assert False
--        except sa.exc.InvalidRequestError, e:
-+        except sa.exc.InvalidRequestError as e:
-             assert "merge() with load=False option does not support "\
-                 "objects marked as 'dirty'.  flush() all changes on "\
-                 "mapped instances before merging with load=False." \
-@@ -924,7 +924,7 @@
-             sess2.expunge_all()
-             eq_(sess2.query(User).get(u2.id).addresses[0].email_address,
-                 'somenewaddress')
--        except sa.exc.InvalidRequestError, e:
-+        except sa.exc.InvalidRequestError as e:
-             assert "load=False option does not support" in str(e)
-
-     def test_synonym_comparable(self):
-diff -r 9d0639b9d3be test/orm/test_naturalpks.py
---- a/test/orm/test_naturalpks.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_naturalpks.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -2,7 +2,7 @@
- Primary key changing capabilities and passive/non-passive cascading updates.
-
- """
--from __future__ import with_statement
-+
- from sqlalchemy.testing import eq_, ne_, \
-                         assert_raises, assert_raises_message
- import sqlalchemy as sa
-@@ -519,11 +519,11 @@
-
-         session = sa.orm.sessionmaker()()
-
--        a_published = User(1, PUBLISHED, u'a')
-+        a_published = User(1, PUBLISHED, 'a')
-         session.add(a_published)
-         session.commit()
-
--        a_editable = User(1, EDITABLE, u'a')
-+        a_editable = User(1, EDITABLE, 'a')
-
-         session.add(a_editable)
-         session.commit()
-diff -r 9d0639b9d3be test/orm/test_pickled.py
---- a/test/orm/test_pickled.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_pickled.py Sat Apr 27 19:42:17 2013 -0400
-@@ -443,21 +443,21 @@
-                 if pickled is not False:
-                     row = pickle.loads(pickle.dumps(row, pickled))
-
--                eq_(row.keys(), ['User', 'Address'])
-+                eq_(list(row.keys()), ['User', 'Address'])
-                 eq_(row.User, row[0])
-                 eq_(row.Address, row[1])
-
-             for row in sess.query(User.name, User.id.label('foobar')):
-                 if pickled is not False:
-                     row = pickle.loads(pickle.dumps(row, pickled))
--                eq_(row.keys(), ['name', 'foobar'])
-+                eq_(list(row.keys()), ['name', 'foobar'])
-                 eq_(row.name, row[0])
-                 eq_(row.foobar, row[1])
-
-             for row in sess.query(User).values(User.name, User.id.label('foobar')):
-                 if pickled is not False:
-                     row = pickle.loads(pickle.dumps(row, pickled))
--                eq_(row.keys(), ['name', 'foobar'])
-+                eq_(list(row.keys()), ['name', 'foobar'])
-                 eq_(row.name, row[0])
-                 eq_(row.foobar, row[1])
-
-@@ -465,21 +465,21 @@
-             for row in sess.query(User, oalias).join(User.orders).all():
-                 if pickled is not False:
-                     row = pickle.loads(pickle.dumps(row, pickled))
--                eq_(row.keys(), ['User'])
-+                eq_(list(row.keys()), ['User'])
-                 eq_(row.User, row[0])
-
-             oalias = aliased(Order, name='orders')
-             for row in sess.query(User, oalias).join(oalias, User.orders).all():
-                 if pickled is not False:
-                     row = pickle.loads(pickle.dumps(row, pickled))
--                eq_(row.keys(), ['User', 'orders'])
-+                eq_(list(row.keys()), ['User', 'orders'])
-                 eq_(row.User, row[0])
-                 eq_(row.orders, row[1])
-
-             # test here that first col is not labeled, only
-             # one name in keys, matches correctly
-             for row in sess.query(User.name + 'hoho', User.name):
--                eq_(row.keys(), ['name'])
-+                eq_(list(row.keys()), ['name'])
-                 eq_(row[0], row.name + 'hoho')
-
-             if pickled is not False:
-diff -r 9d0639b9d3be test/orm/test_query.py
---- a/test/orm/test_query.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_query.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -407,11 +407,12 @@
-             Column('data', Unicode(40)))
-         try:
-             metadata.create_all()
--            # Py3K
--            #ustring = b'petit voix m\xe2\x80\x99a'.decode('utf-8')
--            # Py2K
--            ustring = 'petit voix m\xe2\x80\x99a'.decode('utf-8')
--            # end Py2K
-+# start Py3K
-+            ustring = b'petit voix m\xe2\x80\x99a'.decode('utf-8')
-+# end Py3K
-+# start Py2K
-+#            ustring = 'petit voix m\xe2\x80\x99a'.decode('utf-8')
-+# end Py2K
-
-             table.insert().execute(id=ustring, data=ustring)
-             class LocalFoo(self.classes.Base):
-@@ -637,9 +638,9 @@
-                                 (operator.sub, '-'),
-                                 # Py3k
-                                 #(operator.truediv, '/'),
--                                # Py2K
--                                (operator.div, '/'),
--                                # end Py2K
-+# start Py2K
-+#                                (operator.div, '/'),
-+# end Py2K
-                                 ):
-             for (lhs, rhs, res) in (
-                 (5, User.id, ':id_1 %s users.id'),
-@@ -1047,7 +1048,7 @@
-         adalias = aliased(Address, q1.subquery())
-         eq_(
-             s.query(User, adalias).join(adalias, User.id==adalias.user_id).all(),
--            [(User(id=7,name=u'jack'), Address(email_address=u'jack@bean.com',user_id=7,id=1))]
-+            [(User(id=7,name='jack'), Address(email_address='jack@bean.com',user_id=7,id=1))]
-         )
-
- # more slice tests are available in test/orm/generative.py
-@@ -1196,7 +1197,7 @@
-             "users.name AS users_name FROM users WHERE users.id = :param_1 "
-             "UNION SELECT users.id AS users_id, users.name AS users_name "
-             "FROM users WHERE users.id = :param_2) AS anon_1",
--            checkparams = {u'param_1': 7, u'param_2': 8}
-+            checkparams = {'param_1': 7, 'param_2': 8}
-         )
-
-     def test_any(self):
-@@ -1319,7 +1320,7 @@
-             "FROM users JOIN addresses ON users.id = addresses.user_id "
-             "WHERE users.name = :name_1 AND "
-             "addresses.email_address = :email_address_1",
--            checkparams={u'email_address_1': 'ed@ed.com', u'name_1': 'ed'}
-+            checkparams={'email_address_1': 'ed@ed.com', 'name_1': 'ed'}
-         )
-
-     def test_filter_by_no_property(self):
-@@ -1468,14 +1469,14 @@
-         for q in (q3.order_by(User.id, "anon_1_param_1"), q6.order_by(User.id, "foo")):
-             eq_(q.all(),
-                 [
--                    (User(id=7, name=u'jack'), u'x'),
--                    (User(id=7, name=u'jack'), u'y'),
--                    (User(id=8, name=u'ed'), u'x'),
--                    (User(id=8, name=u'ed'), u'y'),
--                    (User(id=9, name=u'fred'), u'x'),
--                    (User(id=9, name=u'fred'), u'y'),
--                    (User(id=10, name=u'chuck'), u'x'),
--                    (User(id=10, name=u'chuck'), u'y')
-+                    (User(id=7, name='jack'), 'x'),
-+                    (User(id=7, name='jack'), 'y'),
-+                    (User(id=8, name='ed'), 'x'),
-+                    (User(id=8, name='ed'), 'y'),
-+                    (User(id=9, name='fred'), 'x'),
-+                    (User(id=9, name='fred'), 'y'),
-+                    (User(id=10, name='chuck'), 'x'),
-+                    (User(id=10, name='chuck'), 'y')
-                 ]
-             )
-
-@@ -1603,7 +1604,7 @@
-
-         sess = create_session()
-         orders = sess.query(Order).filter(Order.id.in_([2, 3, 4]))
--        eq_(orders.values(func.sum(Order.user_id * Order.address_id)).next(), (79,))
-+        eq_(next(orders.values(func.sum(Order.user_id * Order.address_id))), (79,))
-         eq_(orders.value(func.sum(Order.user_id * Order.address_id)), 79)
-
-     def test_apply(self):
-@@ -1616,9 +1617,9 @@
-         User, Address = self.classes.User, self.classes.Address
-
-         sess = create_session()
--        assert [User(name=u'ed',id=8)] == sess.query(User).order_by(User.id).group_by(User).join('addresses').having(func.count(Address.id)> 2).all()
--
--        assert [User(name=u'jack',id=7), User(name=u'fred',id=9)] == sess.query(User).order_by(User.id).group_by(User).join('addresses').having(func.count(Address.id)< 2).all()
-+        assert [User(name='ed',id=8)] == sess.query(User).order_by(User.id).group_by(User).join('addresses').having(func.count(Address.id)> 2).all()
-+
-+        assert [User(name='jack',id=7), User(name='fred',id=9)] == sess.query(User).order_by(User.id).group_by(User).join('addresses').having(func.count(Address.id)< 2).all()
-
-
- class ExistsTest(QueryTest, AssertsCompiledSQL):
-@@ -1798,14 +1799,14 @@
-
-         ret = []
-         eq_(len(sess.identity_map), 0)
--        ret.append(q.next())
--        ret.append(q.next())
-+        ret.append(next(q))
-+        ret.append(next(q))
-         eq_(len(sess.identity_map), 2)
--        ret.append(q.next())
--        ret.append(q.next())
-+        ret.append(next(q))
-+        ret.append(next(q))
-         eq_(len(sess.identity_map), 4)
-         try:
--            q.next()
-+            next(q)
-             assert False
-         except StopIteration:
-             pass
-@@ -1915,7 +1916,7 @@
-                     User.id, text("users.name"))
-
-         eq_(s.query(User.id, "name").order_by(User.id).all(),
--                [(7, u'jack'), (8, u'ed'), (9, u'fred'), (10, u'chuck')])
-+                [(7, 'jack'), (8, 'ed'), (9, 'fred'), (10, 'chuck')])
-
-     def test_via_select(self):
-         User = self.classes.User
-@@ -1973,7 +1974,7 @@
-         try:
-             q = sess.query(Item).with_parent(u1)
-             assert False
--        except sa_exc.InvalidRequestError, e:
-+        except sa_exc.InvalidRequestError as e:
-             assert str(e) \
-                 == "Could not locate a property which relates "\
-                 "instances of class 'Item' to instances of class 'User'"
-@@ -2058,7 +2059,7 @@
-             "addresses.id AS addresses_id, addresses.user_id AS "
-             "addresses_user_id, addresses.email_address AS addresses_email_address "
-             "FROM addresses WHERE :param_2 = addresses.user_id) AS anon_1",
--            checkparams={u'param_1': 7, u'param_2': 8},
-+            checkparams={'param_1': 7, 'param_2': 8},
-         )
-
-     def test_unique_binds_or(self):
-@@ -2075,7 +2076,7 @@
-             "addresses_user_id, addresses.email_address AS "
-             "addresses_email_address FROM addresses WHERE "
-             ":param_1 = addresses.user_id OR :param_2 = addresses.user_id",
--            checkparams={u'param_1': 7, u'param_2': 8},
-+            checkparams={'param_1': 7, 'param_2': 8},
-         )
-
- class SynonymTest(QueryTest):
-@@ -2117,9 +2118,9 @@
-                         options(joinedload(User.orders_syn)).all()
-             eq_(result, [
-                 User(id=7, name='jack', orders=[
--                    Order(description=u'order 1'),
--                    Order(description=u'order 3'),
--                    Order(description=u'order 5')
-+                    Order(description='order 1'),
-+                    Order(description='order 3'),
-+                    Order(description='order 5')
-                 ])
-             ])
-         self.assert_sql_count(testing.db, go, 1)
-@@ -2133,9 +2134,9 @@
-                         options(joinedload(User.orders_syn_2)).all()
-             eq_(result, [
-                 User(id=7, name='jack', orders=[
--                    Order(description=u'order 1'),
--                    Order(description=u'order 3'),
--                    Order(description=u'order 5')
-+                    Order(description='order 1'),
-+                    Order(description='order 3'),
-+                    Order(description='order 5')
-                 ])
-             ])
-         self.assert_sql_count(testing.db, go, 1)
-@@ -2149,9 +2150,9 @@
-                         options(joinedload('orders_syn_2')).all()
-             eq_(result, [
-                 User(id=7, name='jack', orders=[
--                    Order(description=u'order 1'),
--                    Order(description=u'order 3'),
--                    Order(description=u'order 5')
-+                    Order(description='order 1'),
-+                    Order(description='order 3'),
-+                    Order(description='order 5')
-                 ])
-             ])
-         self.assert_sql_count(testing.db, go, 1)
-@@ -2355,7 +2356,7 @@
-                 if isinstance(item, type):
-                     item = class_mapper(item)
-             else:
--                if isinstance(item, basestring):
-+                if isinstance(item, str):
-                     item = inspect(r[-1]).mapper.attrs[item]
-             r.append(item)
-         return tuple(r)
-diff -r 9d0639b9d3be test/orm/test_relationships.py
---- a/test/orm/test_relationships.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_relationships.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -426,13 +426,13 @@
-         c1 = Company('c1')
-         c2 = Company('c2')
-
--        e1 = Employee(u'emp1', c1, 1)
--        e2 = Employee(u'emp2', c1, 2, e1)
--        e3 = Employee(u'emp3', c1, 3, e1)
--        e4 = Employee(u'emp4', c1, 4, e3)
--        e5 = Employee(u'emp5', c2, 1)
--        e6 = Employee(u'emp6', c2, 2, e5)
--        e7 = Employee(u'emp7', c2, 3, e5)
-+        e1 = Employee('emp1', c1, 1)
-+        e2 = Employee('emp2', c1, 2, e1)
-+        e3 = Employee('emp3', c1, 3, e1)
-+        e4 = Employee('emp4', c1, 4, e3)
-+        e5 = Employee('emp5', c2, 1)
-+        e6 = Employee('emp6', c2, 2, e5)
-+        e7 = Employee('emp7', c2, 3, e5)
-
-         sess.add_all((c1, c2))
-         sess.commit()
-@@ -642,7 +642,7 @@
-         try:
-             sess.flush()
-             assert False
--        except AssertionError, e:
-+        except AssertionError as e:
-             startswith_(str(e),
-                         "Dependency rule tried to blank-out "
-                         "primary key column 'tableB.id' on instance ")
-@@ -667,7 +667,7 @@
-         try:
-             sess.flush()
-             assert False
--        except AssertionError, e:
-+        except AssertionError as e:
-             startswith_(str(e),
-                         "Dependency rule tried to blank-out "
-                         "primary key column 'tableB.id' on instance ")
-@@ -1106,9 +1106,9 @@
-         eq_(
-             sess.query(Subscriber).order_by(Subscriber.type).all(),
-             [
--                Subscriber(id=1, type=u'A'),
--                Subscriber(id=2, type=u'B'),
--                Subscriber(id=2, type=u'C')
-+                Subscriber(id=1, type='A'),
-+                Subscriber(id=2, type='B'),
-+                Subscriber(id=2, type='C')
-             ]
-         )
-
-@@ -1365,7 +1365,7 @@
-         try:
-             sess.add(a1)
-             assert False
--        except AssertionError, err:
-+        except AssertionError as err:
-             eq_(str(err),
-                 "Attribute 'bs' on class '%s' doesn't handle "
-                 "objects of type '%s'" % (A, C))
-diff -r 9d0639b9d3be test/orm/test_session.py
---- a/test/orm/test_session.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_session.py Sat Apr 27 19:42:17 2013 -0400
-@@ -232,7 +232,7 @@
-         # use :bindparam style
-         eq_(sess.execute("select * from users where id=:id",
-                          {'id': 7}).fetchall(),
--            [(7, u'jack')])
-+            [(7, 'jack')])
-
-
-         # use :bindparam style
-@@ -733,7 +733,7 @@
-         # withstand a change?  should this be
-         # more directly attempting to manipulate the identity_map ?
-         u1, u2, u3 = sess.query(User).all()
--        for i, (key, value) in enumerate(sess.identity_map.iteritems()):
-+        for i, (key, value) in enumerate(iter(sess.identity_map.items())):
-             if i == 2:
-                 del u3
-                 gc_collect()
-@@ -747,7 +747,7 @@
-         @event.listens_for(m, "after_update")
-         def e(mapper, conn, target):
-             sess = object_session(target)
--            for entry in sess.identity_map.values():
-+            for entry in list(sess.identity_map.values()):
-                 entry.name = "5"
-
-         a1, a2 = User(name="1"), User(name="2")
-@@ -845,7 +845,7 @@
-         u = session.query(User).filter_by(id=7).one()
-
-         # get everything to load in both directions
--        print [a.user for a in u.addresses]
-+        print([a.user for a in u.addresses])
-
-         # then see if expunge fails
-         session.expunge(u)
-@@ -1187,7 +1187,7 @@
-         s.flush()
-         user = s.query(User).one()
-         user = None
--        print s.identity_map
-+        print(s.identity_map)
-         gc_collect()
-         assert len(s.identity_map) == 1
-
-@@ -1207,7 +1207,7 @@
-         s = create_session(weak_identity_map=False)
-         mapper(User, users)
-
--        for o in [User(name='u%s' % x) for x in xrange(10)]:
-+        for o in [User(name='u%s' % x) for x in range(10)]:
-             s.add(o)
-         # o is still live after this loop...
-
-diff -r 9d0639b9d3be test/orm/test_subquery_relations.py
---- a/test/orm/test_subquery_relations.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_subquery_relations.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -1552,9 +1552,9 @@
-         Movie = self.classes.Movie
-
-         session = Session(testing.db)
--        rscott = Director(name=u"Ridley Scott")
--        alien = Movie(title=u"Alien")
--        brunner = Movie(title=u"Blade Runner")
-+        rscott = Director(name="Ridley Scott")
-+        alien = Movie(title="Alien")
-+        brunner = Movie(title="Blade Runner")
-         rscott.movies.append(brunner)
-         rscott.movies.append(alien)
-         session.add_all([rscott, alien, brunner])
-diff -r 9d0639b9d3be test/orm/test_unitofwork.py
---- a/test/orm/test_unitofwork.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_unitofwork.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -87,7 +87,7 @@
-
-         mapper(Test, uni_t1)
-
--        txt = u"\u0160\u0110\u0106\u010c\u017d"
-+        txt = "\u0160\u0110\u0106\u010c\u017d"
-         t1 = Test(id=1, txt=txt)
-         self.assert_(t1.txt == txt)
-
-@@ -107,7 +107,7 @@
-             't2s': relationship(Test2)})
-         mapper(Test2, uni_t2)
-
--        txt = u"\u0160\u0110\u0106\u010c\u017d"
-+        txt = "\u0160\u0110\u0106\u010c\u017d"
-         t1 = Test(txt=txt)
-         t1.t2s.append(Test2())
-         t1.t2s.append(Test2())
-@@ -132,16 +132,16 @@
-     @classmethod
-     def define_tables(cls, metadata):
-         t1 = Table('unitable1', metadata,
--              Column(u'méil', Integer, primary_key=True, key='a', test_needs_autoincrement=True),
--              Column(u'\u6e2c\u8a66', Integer, key='b'),
-+              Column('méil', Integer, primary_key=True, key='a', test_needs_autoincrement=True),
-+              Column('\u6e2c\u8a66', Integer, key='b'),
-               Column('type',  String(20)),
-               test_needs_fk=True,
-               test_needs_autoincrement=True)
--        t2 = Table(u'Unitéble2', metadata,
--              Column(u'méil', Integer, primary_key=True, key="cc", test_needs_autoincrement=True),
--              Column(u'\u6e2c\u8a66', Integer,
--                     ForeignKey(u'unitable1.a'), key="d"),
--              Column(u'\u6e2c\u8a66_2', Integer, key="e"),
-+        t2 = Table('Unitéble2', metadata,
-+              Column('méil', Integer, primary_key=True, key="cc", test_needs_autoincrement=True),
-+              Column('\u6e2c\u8a66', Integer,
-+                     ForeignKey('unitable1.a'), key="d"),
-+              Column('\u6e2c\u8a66_2', Integer, key="e"),
-               test_needs_fk=True,
-               test_needs_autoincrement=True)
-
-@@ -238,11 +238,12 @@
-         Foo, t1 = self.classes.Foo, self.tables.t1
-
-
--        # Py3K
--        #data = b"this is some data"
--        # Py2K
--        data = "this is some data"
--        # end Py2K
-+# start Py3K
-+        data = b"this is some data"
-+# end Py3K
-+# start Py2K
-+#        data = "this is some data"
-+# end Py2K
-
-         mapper(Foo, t1)
-
-@@ -1054,13 +1055,13 @@
-         session.flush()
-
-         user_rows = users.select(users.c.id.in_([u.id])).execute().fetchall()
--        eq_(user_rows[0].values(), [u.id, 'one2manytester'])
-+        eq_(list(user_rows[0].values()), [u.id, 'one2manytester'])
-
-         address_rows = addresses.select(
-             addresses.c.id.in_([a.id, a2.id]),
-             order_by=[addresses.c.email_address]).execute().fetchall()
--        eq_(address_rows[0].values(), [a2.id, u.id, 'lala@test.org'])
--        eq_(address_rows[1].values(), [a.id, u.id, 'one2many@test.org'])
-+        eq_(list(address_rows[0].values()), [a2.id, u.id, 'lala@test.org'])
-+        eq_(list(address_rows[1].values()), [a.id, u.id, 'one2many@test.org'])
-
-         userid = u.id
-         addressid = a2.id
-@@ -1071,7 +1072,7 @@
-
-         address_rows = addresses.select(
-             addresses.c.id == addressid).execute().fetchall()
--        eq_(address_rows[0].values(),
-+        eq_(list(address_rows[0].values()),
-             [addressid, userid, 'somethingnew@foo.com'])
-         self.assert_(u.id == userid and a2.id == addressid)
-
-@@ -1501,18 +1502,18 @@
-         assert u.name == 'multitester'
-
-         user_rows = users.select(users.c.id.in_([u.foo_id])).execute().fetchall()
--        eq_(user_rows[0].values(), [u.foo_id, 'multitester'])
-+        eq_(list(user_rows[0].values()), [u.foo_id, 'multitester'])
-         address_rows = addresses.select(addresses.c.id.in_([u.id])).execute().fetchall()
--        eq_(address_rows[0].values(), [u.id, u.foo_id, 'multi@test.org'])
-+        eq_(list(address_rows[0].values()), [u.id, u.foo_id, 'multi@test.org'])
-
-         u.email = 'lala@hey.com'
-         u.name = 'imnew'
-         session.flush()
-
-         user_rows = users.select(users.c.id.in_([u.foo_id])).execute().fetchall()
--        eq_(user_rows[0].values(), [u.foo_id, 'imnew'])
-+        eq_(list(user_rows[0].values()), [u.foo_id, 'imnew'])
-         address_rows = addresses.select(addresses.c.id.in_([u.id])).execute().fetchall()
--        eq_(address_rows[0].values(), [u.id, u.foo_id, 'lala@hey.com'])
-+        eq_(list(address_rows[0].values()), [u.id, u.foo_id, 'lala@hey.com'])
-
-         session.expunge_all()
-         u = session.query(User).get(id)
-@@ -1650,7 +1651,7 @@
-         l = sa.select([users, addresses],
-                       sa.and_(users.c.id==addresses.c.user_id,
-                               addresses.c.id==a.id)).execute()
--        eq_(l.first().values(),
-+        eq_(list(l.first().values()),
-             [a.user.id, 'asdf8d', a.id, a.user_id, 'theater@foo.com'])
-
-     def test_many_to_one_1(self):
-@@ -2127,7 +2128,7 @@
-
-         assert assoc.count().scalar() == 2
-         i.keywords = []
--        print i.keywords
-+        print(i.keywords)
-         session.flush()
-         assert assoc.count().scalar() == 0
-
-diff -r 9d0639b9d3be test/orm/test_unitofworkv2.py
---- a/test/orm/test_unitofworkv2.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_unitofworkv2.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -26,7 +26,7 @@
-     def _assert_uow_size(self, session, expected ):
-         uow = self._get_test_uow(session)
-         postsort_actions = uow._generate_actions()
--        print postsort_actions
-+        print(postsort_actions)
-         eq_(len(postsort_actions), expected, postsort_actions)
-
- class UOWTest(_fixtures.FixtureTest,
-@@ -125,12 +125,12 @@
-                 CompiledSQL(
-                     "UPDATE addresses SET user_id=:user_id WHERE "
-                     "addresses.id = :addresses_id",
--                    lambda ctx: [{u'addresses_id': a1.id, 'user_id': None}]
-+                    lambda ctx: [{'addresses_id': a1.id, 'user_id': None}]
-                 ),
-                 CompiledSQL(
-                     "UPDATE addresses SET user_id=:user_id WHERE "
-                     "addresses.id = :addresses_id",
--                    lambda ctx: [{u'addresses_id': a2.id, 'user_id': None}]
-+                    lambda ctx: [{'addresses_id': a2.id, 'user_id': None}]
-                 ),
-                 CompiledSQL(
-                     "DELETE FROM users WHERE users.id = :id",
-@@ -235,12 +235,12 @@
-                 CompiledSQL(
-                     "UPDATE addresses SET user_id=:user_id WHERE "
-                     "addresses.id = :addresses_id",
--                    lambda ctx: [{u'addresses_id': a1.id, 'user_id': None}]
-+                    lambda ctx: [{'addresses_id': a1.id, 'user_id': None}]
-                 ),
-                 CompiledSQL(
-                     "UPDATE addresses SET user_id=:user_id WHERE "
-                     "addresses.id = :addresses_id",
--                    lambda ctx: [{u'addresses_id': a2.id, 'user_id': None}]
-+                    lambda ctx: [{'addresses_id': a2.id, 'user_id': None}]
-                 ),
-                 CompiledSQL(
-                     "DELETE FROM users WHERE users.id = :id",
-@@ -1149,7 +1149,7 @@
-                     "nodes, node_to_nodes WHERE :param_1 = "
-                     "node_to_nodes.right_node_id AND nodes.id = "
-                     "node_to_nodes.left_node_id" ,
--                    lambda ctx:{u'param_1': n1.id},
-+                    lambda ctx:{'param_1': n1.id},
-                 ),
-                 CompiledSQL(
-                     "DELETE FROM node_to_nodes WHERE "
-diff -r 9d0639b9d3be test/orm/test_update_delete.py
---- a/test/orm/test_update_delete.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_update_delete.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -188,22 +188,22 @@
-             update({'age': User.age - 10}, synchronize_session='evaluate')
-
-         eq_([john.age, jack.age, jill.age, jane.age], [25,37,29,27])
--        eq_(sess.query(User.age).order_by(User.id).all(), zip([25,37,29,27]))
-+        eq_(sess.query(User.age).order_by(User.id).all(), list(zip([25,37,29,27])))
-
-         sess.query(User).filter(User.age > 29).\
-             update({User.age: User.age - 10}, synchronize_session='evaluate')
-         eq_([john.age, jack.age, jill.age, jane.age], [25,27,29,27])
--        eq_(sess.query(User.age).order_by(User.id).all(), zip([25,27,29,27]))
-+        eq_(sess.query(User.age).order_by(User.id).all(), list(zip([25,27,29,27])))
-
-         sess.query(User).filter(User.age > 27).\
-                 update({users.c.age: User.age - 10}, synchronize_session='evaluate')
-         eq_([john.age, jack.age, jill.age, jane.age], [25,27,19,27])
--        eq_(sess.query(User.age).order_by(User.id).all(), zip([25,27,19,27]))
-+        eq_(sess.query(User.age).order_by(User.id).all(), list(zip([25,27,19,27])))
-
-         sess.query(User).filter(User.age == 25).\
-                 update({User.age: User.age - 10}, synchronize_session='fetch')
-         eq_([john.age, jack.age, jill.age, jane.age], [15,27,19,27])
--        eq_(sess.query(User.age).order_by(User.id).all(), zip([15,27,19,27]))
-+        eq_(sess.query(User.age).order_by(User.id).all(), list(zip([15,27,19,27])))
-
-     def test_update_against_metadata(self):
-         User, users = self.classes.User, self.tables.users
-@@ -211,7 +211,7 @@
-         sess = Session()
-
-         sess.query(users).update({users.c.age: 29}, synchronize_session=False)
--        eq_(sess.query(User.age).order_by(User.id).all(), zip([29,29,29,29]))
-+        eq_(sess.query(User.age).order_by(User.id).all(), list(zip([29,29,29,29])))
-
-     def test_update_with_bindparams(self):
-         User = self.classes.User
-@@ -224,7 +224,7 @@
-                 update({'age': User.age - 10}, synchronize_session='fetch')
-
-         eq_([john.age, jack.age, jill.age, jane.age], [25,37,29,27])
--        eq_(sess.query(User.age).order_by(User.id).all(), zip([25,37,29,27]))
-+        eq_(sess.query(User.age).order_by(User.id).all(), list(zip([25,37,29,27])))
-
-     def test_update_without_load(self):
-         User = self.classes.User
-@@ -233,7 +233,7 @@
-
-         sess.query(User).filter(User.id == 3).\
-                 update({'age': 44}, synchronize_session='fetch')
--        eq_(sess.query(User.age).order_by(User.id).all(), zip([25,47,44,37]))
-+        eq_(sess.query(User.age).order_by(User.id).all(), list(zip([25,47,44,37])))
-
-     def test_update_changes_resets_dirty(self):
-         User = self.classes.User
-@@ -300,7 +300,7 @@
-                 update({'age': User.age - 10}, synchronize_session='fetch')
-
-         eq_([john.age, jack.age, jill.age, jane.age], [25,37,29,27])
--        eq_(sess.query(User.age).order_by(User.id).all(), zip([25,37,29,27]))
-+        eq_(sess.query(User.age).order_by(User.id).all(), list(zip([25,37,29,27])))
-
-     @testing.fails_if(lambda: not testing.db.dialect.supports_sane_rowcount)
-     def test_update_returns_rowcount(self):
-@@ -334,7 +334,7 @@
-         sess.query(User).update({'age': 42}, synchronize_session='evaluate')
-
-         eq_([john.age, jack.age, jill.age, jane.age], [42,42,42,42])
--        eq_(sess.query(User.age).order_by(User.id).all(), zip([42,42,42,42]))
-+        eq_(sess.query(User.age).order_by(User.id).all(), list(zip([42,42,42,42])))
-
-     def test_delete_all(self):
-         User = self.classes.User
-@@ -516,7 +516,7 @@
-
-         eq_([foo.title, bar.title, baz.title], ['foofoo','barbar', 'baz'])
-         eq_(sess.query(Document.title).order_by(Document.id).all(),
--                zip(['foofoo','barbar', 'baz']))
-+                list(zip(['foofoo','barbar', 'baz'])))
-
-     def test_update_with_explicit_joinedload(self):
-         User = self.classes.User
-@@ -528,7 +528,7 @@
-                 update({'age': User.age - 10}, synchronize_session='fetch')
-
-         eq_([john.age, jack.age, jill.age, jane.age], [25,37,29,27])
--        eq_(sess.query(User.age).order_by(User.id).all(), zip([25,37,29,27]))
-+        eq_(sess.query(User.age).order_by(User.id).all(), list(zip([25,37,29,27])))
-
-     def test_delete_with_eager_relationships(self):
-         Document = self.classes.Document
-@@ -538,7 +538,7 @@
-         sess.query(Document).filter(Document.user_id == 1).\
-                     delete(synchronize_session=False)
-
--        eq_(sess.query(Document.title).all(), zip(['baz']))
-+        eq_(sess.query(Document.title).all(), list(zip(['baz'])))
-
- class UpdateDeleteFromTest(fixtures.MappedTest):
-     @classmethod
-diff -r 9d0639b9d3be test/orm/test_utils.py
---- a/test/orm/test_utils.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/orm/test_utils.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -52,10 +52,10 @@
-         alias = aliased(Point)
-
-         assert Point.zero
--        # Py2K
--        # TODO: what is this testing ??
--        assert not getattr(alias, 'zero')
--        # end Py2K
-+# start Py2K
-+#        # TODO: what is this testing ??
-+#        assert not getattr(alias, 'zero')
-+# end Py2K
-
-     def test_classmethods(self):
-         class Point(object):
-@@ -123,17 +123,19 @@
-                 self.func = func
-             def __get__(self, instance, owner):
-                 if instance is None:
--                    # Py3K
--                    #args = (self.func, owner)
--                    # Py2K
--                    args = (self.func, owner, owner.__class__)
--                    # end Py2K
-+# start Py3K
-+                    args = (self.func, owner)
-+# end Py3K
-+# start Py2K
-+#                    args = (self.func, owner, owner.__class__)
-+# end Py2K
-                 else:
--                    # Py3K
--                    #args = (self.func, instance)
--                    # Py2K
--                    args = (self.func, instance, owner)
--                    # end Py2K
-+# start Py3K
-+                    args = (self.func, instance)
-+# end Py3K
-+# start Py2K
-+#                    args = (self.func, instance, owner)
-+# end Py2K
-                 return types.MethodType(*args)
-
-         class PropertyDescriptor(object):
-diff -r 9d0639b9d3be test/perf/insertspeed.py
---- a/test/perf/insertspeed.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/perf/insertspeed.py Sat Apr 27 19:42:17 2013 -0400
-@@ -13,18 +13,18 @@
-
- def sa_unprofiled_insertmany(n):
-     i = Person_table.insert()
--    i.execute([{'name':'John Doe','sex':1,'age':35} for j in xrange(n)])
-+    i.execute([{'name':'John Doe','sex':1,'age':35} for j in range(n)])
-
- def sqlite_unprofiled_insertmany(n):
-     conn = db.connect().connection
-     c = conn.cursor()
--    persons = [('john doe', 1, 35) for i in xrange(n)]
-+    persons = [('john doe', 1, 35) for i in range(n)]
-     c.executemany("insert into Person(name, sex, age) values (?,?,?)", persons)
-
- @profiling.profiled('sa_profiled_insert_many', always=True)
- def sa_profiled_insert_many(n):
-     i = Person_table.insert()
--    i.execute([{'name':'John Doe','sex':1,'age':35} for j in xrange(n)])
-+    i.execute([{'name':'John Doe','sex':1,'age':35} for j in range(n)])
-     s = Person_table.select()
-     r = s.execute()
-     res = [[value for value in row] for row in r.fetchall()]
-@@ -32,7 +32,7 @@
- def sqlite_unprofiled_insert(n):
-     conn = db.connect().connection
-     c = conn.cursor()
--    for j in xrange(n):
-+    for j in range(n):
-         c.execute("insert into Person(name, sex, age) values (?,?,?)",
-                   ('john doe', 1, 35))
-
-@@ -40,13 +40,13 @@
-     # Another option is to build Person_table.insert() outside of the
-     # loop. But it doesn't make much of a difference, so might as well
-     # use the worst-case/naive version here.
--    for j in xrange(n):
-+    for j in range(n):
-         Person_table.insert().execute({'name':'John Doe','sex':1,'age':35})
-
- @profiling.profiled('sa_profiled_insert', always=True)
- def sa_profiled_insert(n):
-     i = Person_table.insert()
--    for j in xrange(n):
-+    for j in range(n):
-         i.execute({'name':'John Doe','sex':1,'age':35})
-     s = Person_table.select()
-     r = s.execute()
-@@ -69,12 +69,12 @@
-     metadata.drop_all()
-     metadata.create_all()
-
--    print "%s (%s)" % (label, ', '.join([str(a) for a in args]))
-+    print("%s (%s)" % (label, ', '.join([str(a) for a in args])))
-     fn(*args, **kw)
-
- def all():
-     try:
--        print "Bulk INSERTS via executemany():\n"
-+        print("Bulk INSERTS via executemany():\n")
-
-         run_timed(sqlite_unprofiled_insertmany,
-                   'pysqlite bulk insert',
-@@ -88,7 +88,7 @@
-                      'SQLAlchemy bulk insert/select, profiled',
-                      50000)
-
--        print "\nIndividual INSERTS via execute():\n"
-+        print("\nIndividual INSERTS via execute():\n")
-
-         run_timed(sqlite_unprofiled_insert,
-                   "pysqlite individual insert",
-diff -r 9d0639b9d3be test/perf/objselectspeed.py
---- a/test/perf/objselectspeed.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/perf/objselectspeed.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -36,7 +36,7 @@
-     metadata.create_all()
-     i = Person_table.insert()
-     data = [{'name':'John Doe','sex':1,'age':35, 'type':'employee'}] * 100
--    for j in xrange(500):
-+    for j in range(500):
-         i.execute(data)
-
-     # note we arent fetching from employee_table,
-@@ -46,7 +46,7 @@
-     #for j in xrange(500):
-     #    i.execute(data)
-
--    print "Inserted 50,000 rows"
-+    print("Inserted 50,000 rows")
-
- def sqlite_select(entity_cls):
-     conn = db.connect().connection
-@@ -89,10 +89,10 @@
-         t, t2 = 0, 0
-         def usage(label):
-             now = resource.getrusage(resource.RUSAGE_SELF)
--            print "%s: %0.3fs real, %0.3fs user, %0.3fs sys" % (
-+            print("%s: %0.3fs real, %0.3fs user, %0.3fs sys" % (
-                 label, t2 - t,
-                 now.ru_utime - usage.last.ru_utime,
--                now.ru_stime - usage.last.ru_stime)
-+                now.ru_stime - usage.last.ru_stime))
-             usage.snap(now)
-         usage.snap = lambda stats=None: setattr(
-             usage, 'last', stats or resource.getrusage(resource.RUSAGE_SELF))
-diff -r 9d0639b9d3be test/perf/objupdatespeed.py
---- a/test/perf/objupdatespeed.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/perf/objupdatespeed.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -39,12 +39,12 @@
-     i.execute(data)
-
-     i = Email_table.insert()
--    for j in xrange(1, NUM + 1):
-+    for j in range(1, NUM + 1):
-         i.execute(address='foo@bar', person_id=j)
-         if j % 2:
-             i.execute(address='baz@quux', person_id=j)
-
--    print "Inserted %d rows." % (NUM + NUM + (NUM // 2))
-+    print("Inserted %d rows." % (NUM + NUM + (NUM // 2)))
-
- def orm_select(session):
-     return session.query(Person).all()
-@@ -63,10 +63,10 @@
-         t, t2 = 0, 0
-         def usage(label):
-             now = resource.getrusage(resource.RUSAGE_SELF)
--            print "%s: %0.3fs real, %0.3fs user, %0.3fs sys" % (
-+            print("%s: %0.3fs real, %0.3fs user, %0.3fs sys" % (
-                 label, t2 - t,
-                 now.ru_utime - usage.last.ru_utime,
--                now.ru_stime - usage.last.ru_stime)
-+                now.ru_stime - usage.last.ru_stime))
-             usage.snap(now)
-         usage.snap = lambda stats=None: setattr(
-             usage, 'last', stats or resource.getrusage(resource.RUSAGE_SELF))
-diff -r 9d0639b9d3be test/perf/orm2010.py
---- a/test/perf/orm2010.py     Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/perf/orm2010.py     Sat Apr 27 19:42:17 2013 -0400
-@@ -95,7 +95,7 @@
-             name="Boss %d" % i,
-             golf_average=Decimal(random.randint(40, 150))
-         )
--        for i in xrange(1000)
-+        for i in range(1000)
-     ]
-
-     sess.add_all(bosses)
-@@ -107,7 +107,7 @@
-             name="Grunt %d" % i,
-             savings=Decimal(random.randint(5000000, 15000000) / 100)
-         )
--        for i in xrange(10000)
-+        for i in range(10000)
-     ]
-
-     # Assign each Grunt a Boss.  Look them up in the DB
-@@ -149,15 +149,15 @@
-
- counts_by_methname = dict((key[2], stats.stats[key][0]) for key in stats.stats)
-
--print "SQLA Version: %s" % __version__
--print "Total calls %d" % stats.total_calls
--print "Total cpu seconds: %.2f" % stats.total_tt
--print 'Total execute calls: %d' \
-+print("SQLA Version: %s" % __version__)
-+print("Total calls %d" % stats.total_calls)
-+print("Total cpu seconds: %.2f" % stats.total_tt)
-+print('Total execute calls: %d' \
-     % counts_by_methname["<method 'execute' of 'sqlite3.Cursor' "
--                         "objects>"]
--print 'Total executemany calls: %d' \
-+                         "objects>"])
-+print('Total executemany calls: %d' \
-     % counts_by_methname.get("<method 'executemany' of 'sqlite3.Cursor' "
--                         "objects>", 0)
-+                         "objects>", 0))
-
- #stats.sort_stats('time', 'calls')
- #stats.print_stats()
-diff -r 9d0639b9d3be test/perf/ormsession.py
---- a/test/perf/ormsession.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/perf/ormsession.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -81,9 +81,9 @@
-
-     transaction = con.begin()
-     data, subdata = [], []
--    for item_id in xrange(1, q_items + 1):
-+    for item_id in range(1, q_items + 1):
-         data.append({'name': "item number %s" % item_id})
--        for subitem_id in xrange(1, (item_id % q_sub_per_item) + 1):
-+        for subitem_id in range(1, (item_id % q_sub_per_item) + 1):
-             subdata.append({'item_id': item_id,
-                          'name': "subitem number %s" % subitem_id})
-         if item_id % 100 == 0:
-@@ -99,7 +99,7 @@
-
-     transaction = con.begin()
-     data = []
--    for customer_id in xrange(1, q_customers):
-+    for customer_id in range(1, q_customers):
-         data.append({'name': "customer number %s" % customer_id})
-         if customer_id % 100 == 0:
-             customers.insert().execute(*data)
-@@ -111,7 +111,7 @@
-     transaction = con.begin()
-     data, subdata = [], []
-     order_t = int(time.time()) - (5000 * 5 * 60)
--    current = xrange(1, q_customers)
-+    current = range(1, q_customers)
-     step, purchase_id = 1, 0
-     while current:
-         next = []
-diff -r 9d0639b9d3be test/perf/stress_all.py
---- a/test/perf/stress_all.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/perf/stress_all.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -2,7 +2,7 @@
- from datetime import *
- import decimal
- #from fastdec import mpd as Decimal
--from cPickle import dumps, loads
-+from pickle import dumps, loads
-
- #from sqlalchemy.dialects.postgresql.base import ARRAY
-
-@@ -42,9 +42,9 @@
-
- def getitem_long_results(raw_results):
-     return [
--        (r[0L],
--         r[1L], r[2L], r[3L], r[4L], r[5L],
--         r[6L], r[7L], r[8L], r[9L], r[10L])
-+        (r[0],
-+         r[1], r[2], r[3], r[4], r[5],
-+         r[6], r[7], r[8], r[9], r[10])
-          for r in raw_results]
-
- def getitem_obj_results(raw_results):
-@@ -128,7 +128,7 @@
-
- # Unicode
- def genunicodevalue(rnum, fnum):
--    return (rnum % 4) and (u"value%d" % fnum) or None
-+    return (rnum % 4) and ("value%d" % fnum) or None
- unicodetest = (Unicode(20, ), genunicodevalue,
-                dict(num_records=100000))
- #               dict(engineurl='mysql:///test', freshdata=False))
-@@ -139,10 +139,10 @@
-              pickletypetest, typedecoratortest, unicodetest]
-     for engineurl in ('postgresql://scott:tiger@localhost/test',
-                         'sqlite://', 'mysql://scott:tiger@localhost/test'):
--        print "\n%s\n" % engineurl
-+        print("\n%s\n" % engineurl)
-         for datatype, genvalue, kwargs in tests:
--            print "%s:" % getattr(datatype, '__name__',
--                                  datatype.__class__.__name__),
-+            print("%s:" % getattr(datatype, '__name__',
-+                                  datatype.__class__.__name__), end=' ')
-             profile_and_time_dbfunc(iter_results, datatype, genvalue,
-                                     profile=False, engineurl=engineurl,
-                                     verbose=verbose, **kwargs)
-@@ -158,13 +158,13 @@
-                slice_results]
-     for engineurl in ('postgresql://scott:tiger@localhost/test',
-                        'sqlite://', 'mysql://scott:tiger@localhost/test'):
--        print "\n%s\n" % engineurl
-+        print("\n%s\n" % engineurl)
-         test_table = prepare(Unicode(20,),
-                              genunicodevalue,
-                              num_fields=10, num_records=100000,
-                              verbose=verbose, engineurl=engineurl)
-         for method in methods:
--            print "%s:" % method.__name__,
-+            print("%s:" % method.__name__, end=' ')
-             time_dbfunc(test_table, method, genunicodevalue,
-                         num_fields=10, num_records=100000, profile=False,
-                         verbose=verbose)
-@@ -174,9 +174,9 @@
- # --------------------------------
-
- def pickletofile_results(raw_results):
--    from cPickle import dump, load
-+    from pickle import dump, load
-     for protocol in (0, 1, 2):
--        print "dumping protocol %d..." % protocol
-+        print("dumping protocol %d..." % protocol)
-         f = file('noext.pickle%d' % protocol, 'wb')
-         dump(raw_results, f, protocol)
-         f.close()
-@@ -198,7 +198,7 @@
-                          num_fields=10, num_records=10000)
-     funcs = [pickle_rows, pickle_results]
-     for func in funcs:
--        print "%s:" % func.__name__,
-+        print("%s:" % func.__name__, end=' ')
-         time_dbfunc(test_table, func, genunicodevalue,
-                     num_records=10000, profile=False, verbose=verbose)
-
-@@ -217,9 +217,9 @@
-
-     def get_results():
-         return session.query(Test).all()
--    print "ORM:",
-+    print("ORM:", end=' ')
-     for engineurl in ('postgresql:///test', 'sqlite://', 'mysql:///test'):
--        print "\n%s\n" % engineurl
-+        print("\n%s\n" % engineurl)
-         profile_and_time_dbfunc(getattr_results, Unicode(20), genunicodevalue,
-                                 class_=Test, getresults_func=get_results,
-                                 engineurl=engineurl, #freshdata=False,
-diff -r 9d0639b9d3be test/perf/stresstest.py
---- a/test/perf/stresstest.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/perf/stresstest.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -17,13 +17,13 @@
-
- def insert(test_table, num_fields, num_records, genvalue, verbose=True):
-     if verbose:
--        print "building insert values...",
-+        print("building insert values...", end=' ')
-         sys.stdout.flush()
-     values = [dict(("field%d" % fnum, genvalue(rnum, fnum))
-                    for fnum in range(num_fields))
-               for rnum in range(num_records)]
-     if verbose:
--        print "inserting...",
-+        print("inserting...", end=' ')
-         sys.stdout.flush()
-     def db_insert():
-         test_table.insert().execute(values)
-@@ -32,11 +32,11 @@
-                             "from __main__ import db_insert",
-                             number=1)
-     if verbose:
--        print "%s" % round(timing, 3)
-+        print("%s" % round(timing, 3))
-
- def check_result(results, num_fields, genvalue, verbose=True):
-     if verbose:
--        print "checking...",
-+        print("checking...", end=' ')
-         sys.stdout.flush()
-     for rnum, row in enumerate(results):
-         expected = tuple([rnum + 1] +
-@@ -49,28 +49,28 @@
-
- def nicer_res(values, printvalues=False):
-     if printvalues:
--        print values
-+        print(values)
-     min_time = min(values)
-     return round(min_time, 3), round(avgdev(values, min_time), 2)
-
- def profile_func(func_name, verbose=True):
-     if verbose:
--        print "profiling...",
-+        print("profiling...", end=' ')
-         sys.stdout.flush()
-     cProfile.run('%s()' % func_name, 'prof')
-
- def time_func(func_name, num_tests=1, verbose=True):
-     if verbose:
--        print "timing...",
-+        print("timing...", end=' ')
-         sys.stdout.flush()
-     timings = timeit.repeat('%s()' % func_name,
-                             "from __main__ import %s" % func_name,
-                             number=num_tests, repeat=5)
-     avg, dev = nicer_res(timings)
-     if verbose:
--        print "%s (%s)" % (avg, dev)
-+        print("%s (%s)" % (avg, dev))
-     else:
--        print avg
-+        print(avg)
-
- def profile_and_time(func_name, num_tests=1):
-     profile_func(func_name)
-@@ -121,7 +121,7 @@
-                 check_results=check_result, profile=True,
-                 check_leaks=True, print_leaks=False, verbose=True):
-     if verbose:
--        print "testing '%s'..." % test_func.__name__,
-+        print("testing '%s'..." % test_func.__name__, end=' ')
-     sys.stdout.flush()
-     if class_ is not None:
-         clear_mappers()
-@@ -148,12 +148,12 @@
-         diff = hashable_objects_after - hashable_objects_before
-         ldiff = len(diff)
-         if print_leaks and ldiff < num_records:
--            print "\n*** hashable objects leaked (%d) ***" % ldiff
--            print '\n'.join(map(str, diff))
--            print "***\n"
-+            print("\n*** hashable objects leaked (%d) ***" % ldiff)
-+            print('\n'.join(map(str, diff)))
-+            print("***\n")
-
-         if num_leaks > num_records:
--            print "(leaked: %d !)" % num_leaks,
-+            print("(leaked: %d !)" % num_leaks, end=' ')
-     if profile:
-         profile_func('test', verbose)
-     time_func('test', num_tests, verbose)
-diff -r 9d0639b9d3be test/perf/threaded_compile.py
---- a/test/perf/threaded_compile.py    Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/perf/threaded_compile.py    Sat Apr 27 19:42:17 2013 -0400
-@@ -4,7 +4,7 @@
-
- from sqlalchemy import *
- from sqlalchemy.orm import *
--import thread, time
-+import _thread, time
- from sqlalchemy.orm import mapperlib
-
-
-@@ -42,20 +42,20 @@
-
- def run1():
-     for i in range(50):
--        print "T1", thread.get_ident()
-+        print("T1", _thread.get_ident())
-         class_mapper(T1)
-         time.sleep(.05)
-
- def run2():
-     for i in range(50):
--        print "T2", thread.get_ident()
-+        print("T2", _thread.get_ident())
-         class_mapper(T2)
-         time.sleep(.057)
-
- def run3():
-     for i in range(50):
-         def foo():
--            print "FOO", thread.get_ident()
-+            print("FOO", _thread.get_ident())
-             class Foo(object):pass
-             mapper(Foo, t3)
-             class_mapper(Foo).compile()
-@@ -64,12 +64,12 @@
-
- mapper(T1, t1, properties={'t2':relationship(T2, backref="t1")})
- mapper(T2, t2)
--print "START"
-+print("START")
- for j in range(0, 5):
--    thread.start_new_thread(run1, ())
--    thread.start_new_thread(run2, ())
--    thread.start_new_thread(run3, ())
--    thread.start_new_thread(run3, ())
--    thread.start_new_thread(run3, ())
--print "WAIT"
-+    _thread.start_new_thread(run1, ())
-+    _thread.start_new_thread(run2, ())
-+    _thread.start_new_thread(run3, ())
-+    _thread.start_new_thread(run3, ())
-+    _thread.start_new_thread(run3, ())
-+print("WAIT")
- time.sleep(5)
-diff -r 9d0639b9d3be test/sql/test_compiler.py
---- a/test/sql/test_compiler.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/sql/test_compiler.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -661,13 +661,13 @@
-         s = select([table1.c.myid]).as_scalar()
-         try:
-             s.c.foo
--        except exc.InvalidRequestError, err:
-+        except exc.InvalidRequestError as err:
-             assert str(err) \
-                 == 'Scalar Select expression has no columns; use this '\
-                 'object directly within a column-level expression.'
-         try:
-             s.columns.foo
--        except exc.InvalidRequestError, err:
-+        except exc.InvalidRequestError as err:
-             assert str(err) \
-                 == 'Scalar Select expression has no columns; use this '\
-                 'object directly within a column-level expression.'
-@@ -1116,9 +1116,9 @@
-
-         # test unicode
-         self.assert_compile(select(
--            [u"foobar(a)", u"pk_foo_bar(syslaal)"],
--            u"a = 12",
--            from_obj=[u"foobar left outer join lala on foobar.foo = lala.foo"]
-+            ["foobar(a)", "pk_foo_bar(syslaal)"],
-+            "a = 12",
-+            from_obj=["foobar left outer join lala on foobar.foo = lala.foo"]
-             ),
-             "SELECT foobar(a), pk_foo_bar(syslaal) FROM foobar "
-             "left outer join lala on foobar.foo = lala.foo WHERE a = 12"
-@@ -2245,7 +2245,7 @@
-                     func.lala(table1.c.name).label('gg')])
-
-         eq_(
--            s1.c.keys(),
-+            list(s1.c.keys()),
-             ['myid', 'foobar', str(f1), 'gg']
-         )
-
-@@ -2273,7 +2273,7 @@
-                 t = table1
-
-             s1 = select([col], from_obj=t)
--            assert s1.c.keys() == [key], s1.c.keys()
-+            assert list(s1.c.keys()) == [key], list(s1.c.keys())
-
-             if label:
-                 self.assert_compile(s1,
-@@ -2679,11 +2679,11 @@
-     def test_reraise_of_column_spec_issue_unicode(self):
-         MyType = self._illegal_type_fixture()
-         t1 = Table('t', MetaData(),
--            Column(u'méil', MyType())
-+            Column('méil', MyType())
-         )
-         assert_raises_message(
-             exc.CompileError,
--            ur"\(in table 't', column 'méil'\): Couldn't compile type",
-+            r"\(in table 't', column 'méil'\): Couldn't compile type",
-             schema.CreateTable(t1).compile
-         )
-
-diff -r 9d0639b9d3be test/sql/test_defaults.py
---- a/test/sql/test_defaults.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/sql/test_defaults.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -600,7 +600,7 @@
-             nonai.insert().execute(data='row 1')
-             nonai.insert().execute(data='row 2')
-             assert False
--        except sa.exc.DBAPIError, e:
-+        except sa.exc.DBAPIError as e:
-             assert True
-
-         nonai.insert().execute(id=1, data='row 1')
-@@ -649,7 +649,7 @@
-     def _assert_seq_result(self, ret):
-         """asserts return of next_value is an int"""
-
--        assert isinstance(ret, (int, long))
-+        assert isinstance(ret, int)
-         assert ret > 0
-
-     def test_implicit_connectionless(self):
-@@ -781,7 +781,7 @@
-                 ]
-                 start = seq.start or 1
-                 inc = seq.increment or 1
--                assert values == list(xrange(start, start + inc * 3, inc))
-+                assert values == list(range(start, start + inc * 3, inc))
-
-             finally:
-                 seq.drop(testing.db)
-@@ -1156,20 +1156,22 @@
-         c = Column(Unicode(32))
-
-     def test_unicode_default(self):
--        # Py3K
--        #default = 'foo'
--        # Py2K
--        default = u'foo'
--        # end Py2K
-+# start Py3K
-+        default = 'foo'
-+# end Py3K
-+# start Py2K
-+#        default = u'foo'
-+# end Py2K
-         c = Column(Unicode(32), default=default)
-
-
-     def test_nonunicode_default(self):
--        # Py3K
--        #default = b'foo'
--        # Py2K
--        default = 'foo'
--        # end Py2K
-+# start Py3K
-+        default = b'foo'
-+# end Py3K
-+# start Py2K
-+#        default = 'foo'
-+# end Py2K
-         assert_raises_message(
-             sa.exc.SAWarning,
-             "Unicode column received non-unicode default value.",
-diff -r 9d0639b9d3be test/sql/test_functions.py
---- a/test/sql/test_functions.py       Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/sql/test_functions.py       Sat Apr 27 19:42:17 2013 -0400
-@@ -381,7 +381,7 @@
-             assert t.select(t.c.id == id).execute().first()['value'] == 9
-             t.update(values={t.c.value: func.length("asdf")}).execute()
-             assert t.select().execute().first()['value'] == 4
--            print "--------------------------"
-+            print("--------------------------")
-             t2.insert().execute()
-             t2.insert(values=dict(value=func.length("one"))).execute()
-             t2.insert(values=dict(value=func.length("asfda") + -19)).\
-@@ -409,7 +409,7 @@
-
-             t2.update(values={t2.c.value: func.length("asfdaasdf"),
-                                         t2.c.stuff: "foo"}).execute()
--            print "HI", select([t2.c.value, t2.c.stuff]).execute().first()
-+            print("HI", select([t2.c.value, t2.c.stuff]).execute().first())
-             eq_(select([t2.c.value, t2.c.stuff]).execute().first(),
-                     (9, "foo")
-                 )
-diff -r 9d0639b9d3be test/sql/test_generative.py
---- a/test/sql/test_generative.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/sql/test_generative.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -176,7 +176,7 @@
-         canary = []
-         def visit(binary, l, r):
-             canary.append((binary.operator, l, r))
--            print binary.operator, l, r
-+            print(binary.operator, l, r)
-         sql_util.visit_binary_product(visit, expr)
-         eq_(
-             canary, expected
-@@ -433,7 +433,7 @@
-         clause2 = Vis().traverse(clause)
-         assert c1 == str(clause)
-         assert str(clause2) == c1 + " SOME MODIFIER=:lala"
--        assert clause.bindparams.keys() == ['bar']
-+        assert list(clause.bindparams.keys()) == ['bar']
-         assert set(clause2.bindparams.keys()) == set(['bar', 'lala'])
-
-     def test_select(self):
-@@ -446,8 +446,8 @@
-         s3 = Vis().traverse(s2)
-         assert str(s3) == s3_assert
-         assert str(s2) == s2_assert
--        print str(s2)
--        print str(s3)
-+        print(str(s2))
-+        print(str(s3))
-         class Vis(ClauseVisitor):
-             def visit_select(self, select):
-                 select.append_whereclause(t1.c.col2 == 7)
-@@ -459,8 +459,8 @@
-             def visit_select(self, select):
-                 select.append_whereclause(t1.c.col3 == 9)
-         s4 = Vis().traverse(s3)
--        print str(s3)
--        print str(s4)
-+        print(str(s3))
-+        print(str(s4))
-         assert str(s4) == s4_assert
-         assert str(s3) == s3_assert
-
-@@ -471,8 +471,8 @@
-                     binary.left = t1.c.col1
-                     binary.right = bindparam("col1", unique=True)
-         s5 = Vis().traverse(s4)
--        print str(s4)
--        print str(s5)
-+        print(str(s4))
-+        print(str(s5))
-         assert str(s5) == s5_assert
-         assert str(s4) == s4_assert
-
-diff -r 9d0639b9d3be test/sql/test_metadata.py
---- a/test/sql/test_metadata.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/sql/test_metadata.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -89,7 +89,7 @@
-             msgs.append("attach %s.%s" % (t.name, c.name))
-         c1 = Column('foo', String())
-         m = MetaData()
--        for i in xrange(3):
-+        for i in range(3):
-             cx = c1.copy()
-             # as of 0.7, these events no longer copy.  its expected
-             # that listeners will be re-established from the
-@@ -511,7 +511,7 @@
-         def _get_key(i):
-             return [i.name, i.unique] + \
-                     sorted(i.kwargs.items()) + \
--                    i.columns.keys()
-+                    list(i.columns.keys())
-
-         eq_(
-             sorted([_get_key(i) for i in table.indexes]),
-diff -r 9d0639b9d3be test/sql/test_query.py
---- a/test/sql/test_query.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/sql/test_query.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -367,10 +367,10 @@
-                 )
-                 if use_labels:
-                     eq_(result[0]['query_users_user_id'], 7)
--                    eq_(result[0].keys(), ["query_users_user_id", "query_users_user_name"])
-+                    eq_(list(result[0].keys()), ["query_users_user_id", "query_users_user_name"])
-                 else:
-                     eq_(result[0]['user_id'], 7)
--                    eq_(result[0].keys(), ["user_id", "user_name"])
-+                    eq_(list(result[0].keys()), ["user_id", "user_name"])
-
-                 eq_(result[0][0], 7)
-                 eq_(result[0][users.c.user_id], 7)
-@@ -523,13 +523,13 @@
-
-         def a_eq(got, wanted):
-             if got != wanted:
--                print "Wanted %s" % wanted
--                print "Received %s" % got
-+                print("Wanted %s" % wanted)
-+                print("Received %s" % got)
-             self.assert_(got == wanted, got)
-
-         a_eq(prep('select foo'), 'select foo')
-         a_eq(prep("time='12:30:00'"), "time='12:30:00'")
--        a_eq(prep(u"time='12:30:00'"), u"time='12:30:00'")
-+        a_eq(prep("time='12:30:00'"), "time='12:30:00'")
-         a_eq(prep(":this:that"), ":this:that")
-         a_eq(prep(":this :that"), "? ?")
-         a_eq(prep("(:this),(:that :other)"), "(?),(? ?)")
-@@ -769,7 +769,7 @@
-             ).first()
-         eq_(r['user_id'], 1)
-         eq_(r['user_name'], "john")
--        eq_(r.keys(), ["user_id", "user_name"])
-+        eq_(list(r.keys()), ["user_id", "user_name"])
-
-     @testing.only_on("sqlite", "sqlite specific feature")
-     def test_column_accessor_sqlite_raw(self):
-@@ -784,7 +784,7 @@
-         assert 'user_name' not in r
-         eq_(r['query_users.user_id'], 1)
-         eq_(r['query_users.user_name'], "john")
--        eq_(r.keys(), ["query_users.user_id", "query_users.user_name"])
-+        eq_(list(r.keys()), ["query_users.user_id", "query_users.user_name"])
-
-     @testing.only_on("sqlite", "sqlite specific feature")
-     def test_column_accessor_sqlite_translated(self):
-@@ -799,7 +799,7 @@
-         eq_(r['user_name'], "john")
-         eq_(r['query_users.user_id'], 1)
-         eq_(r['query_users.user_name'], "john")
--        eq_(r.keys(), ["user_id", "user_name"])
-+        eq_(list(r.keys()), ["user_id", "user_name"])
-
-     def test_column_accessor_labels_w_dots(self):
-         users.insert().execute(
-@@ -812,7 +812,7 @@
-         eq_(r['query_users.user_id'], 1)
-         eq_(r['query_users.user_name'], "john")
-         assert "user_name" not in r
--        eq_(r.keys(), ["query_users.user_id", "query_users.user_name"])
-+        eq_(list(r.keys()), ["query_users.user_id", "query_users.user_name"])
-
-     def test_column_accessor_unary(self):
-         users.insert().execute(
-@@ -889,7 +889,7 @@
-             ])
-         ).first()
-
--        eq_(row.keys(), ["case_insensitive", "CaseSensitive"])
-+        eq_(list(row.keys()), ["case_insensitive", "CaseSensitive"])
-         eq_(row["case_insensitive"], 1)
-         eq_(row["CaseSensitive"], 2)
-
-@@ -911,7 +911,7 @@
-             ])
-         ).first()
-
--        eq_(row.keys(), ["case_insensitive", "CaseSensitive"])
-+        eq_(list(row.keys()), ["case_insensitive", "CaseSensitive"])
-         eq_(row["case_insensitive"], 1)
-         eq_(row["CaseSensitive"], 2)
-         eq_(row["Case_insensitive"],1)
-@@ -1072,14 +1072,14 @@
-     def test_keys(self):
-         users.insert().execute(user_id=1, user_name='foo')
-         r = users.select().execute()
--        eq_([x.lower() for x in r.keys()], ['user_id', 'user_name'])
-+        eq_([x.lower() for x in list(r.keys())], ['user_id', 'user_name'])
-         r = r.first()
--        eq_([x.lower() for x in r.keys()], ['user_id', 'user_name'])
-+        eq_([x.lower() for x in list(r.keys())], ['user_id', 'user_name'])
-
-     def test_items(self):
-         users.insert().execute(user_id=1, user_name='foo')
-         r = users.select().execute().first()
--        eq_([(x[0].lower(), x[1]) for x in r.items()], [('user_id', 1), ('user_name', 'foo')])
-+        eq_([(x[0].lower(), x[1]) for x in list(r.items())], [('user_id', 1), ('user_name', 'foo')])
-
-     def test_len(self):
-         users.insert().execute(user_id=1, user_name='foo')
-@@ -1098,8 +1098,8 @@
-         r = users.select(users.c.user_id==1).execute().first()
-         eq_(r[0], 1)
-         eq_(r[1], 'foo')
--        eq_([x.lower() for x in r.keys()], ['user_id', 'user_name'])
--        eq_(r.values(), [1, 'foo'])
-+        eq_([x.lower() for x in list(r.keys())], ['user_id', 'user_name'])
-+        eq_(list(r.values()), [1, 'foo'])
-
-     def test_column_order_with_text_query(self):
-         # should return values in query order
-@@ -1107,8 +1107,8 @@
-         r = testing.db.execute('select user_name, user_id from query_users').first()
-         eq_(r[0], 'foo')
-         eq_(r[1], 1)
--        eq_([x.lower() for x in r.keys()], ['user_name', 'user_id'])
--        eq_(r.values(), ['foo', 1])
-+        eq_([x.lower() for x in list(r.keys())], ['user_name', 'user_id'])
-+        eq_(list(r.values()), ['foo', 1])
-
-     @testing.crashes('oracle', 'FIXME: unknown, varify not fails_on()')
-     @testing.crashes('firebird', 'An identifier must begin with a letter')
-@@ -1137,7 +1137,7 @@
-             self.assert_(r['_parent'] == 'Hidden parent')
-             self.assert_(r['_row'] == 'Hidden row')
-             try:
--                print r._parent, r._row
-+                print(r._parent, r._row)
-                 self.fail('Should not allow access to private attributes')
-             except AttributeError:
-                 pass # expected
-@@ -2334,7 +2334,7 @@
-             expr = select(
-                 [t1.c.t1_id, t2.c.t2_id, t3.c.t3_id],
-                 from_obj=[(t1.join(t2).outerjoin(t3, criteria))])
--            print expr
-+            print(expr)
-             self.assertRows(expr, [(10, 20, 30), (11, 21, None)])
-
-     def test_mixed_where(self):
-@@ -2416,7 +2416,7 @@
-             select([
-                 flds.c.intcol, func.row_number().over(order_by=flds.c.strcol)
-             ]).execute().fetchall(),
--            [(13, 1L), (5, 2L)]
-+            [(13, 1), (5, 2)]
-         )
-
-
-diff -r 9d0639b9d3be test/sql/test_quote.py
---- a/test/sql/test_quote.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/sql/test_quote.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -552,8 +552,8 @@
-
-         def a_eq(have, want):
-             if have != want:
--                print "Wanted %s" % want
--                print "Received %s" % have
-+                print("Wanted %s" % want)
-+                print("Received %s" % have)
-             self.assert_(have == want)
-
-         a_eq(unformat('foo'), ['foo'])
-@@ -584,13 +584,13 @@
-
-         def a_eq(have, want):
-             if have != want:
--                print "Wanted %s" % want
--                print "Received %s" % have
-+                print("Wanted %s" % want)
-+                print("Received %s" % have)
-             self.assert_(have == want)
-
-         a_eq(unformat('foo'), ['foo'])
-         a_eq(unformat('`foo`'), ['foo'])
--        a_eq(unformat(`'foo'`), ["'foo'"])
-+        a_eq(unformat(repr('foo')), ["'foo'"])
-         a_eq(unformat('foo.bar'), ['foo', 'bar'])
-         a_eq(unformat('`foo`.`bar`'), ['foo', 'bar'])
-         a_eq(unformat('foo.`bar`'), ['foo', 'bar'])
-diff -r 9d0639b9d3be test/sql/test_rowcount.py
---- a/test/sql/test_rowcount.py        Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/sql/test_rowcount.py        Sat Apr 27 19:42:17 2013 -0400
-@@ -53,20 +53,20 @@
-         # WHERE matches 3, 3 rows changed
-         department = employees_table.c.department
-         r = employees_table.update(department=='C').execute(department='Z')
--        print "expecting 3, dialect reports %s" % r.rowcount
-+        print("expecting 3, dialect reports %s" % r.rowcount)
-         assert r.rowcount == 3
-
-     def test_update_rowcount2(self):
-         # WHERE matches 3, 0 rows changed
-         department = employees_table.c.department
-         r = employees_table.update(department=='C').execute(department='C')
--        print "expecting 3, dialect reports %s" % r.rowcount
-+        print("expecting 3, dialect reports %s" % r.rowcount)
-         assert r.rowcount == 3
-
-     def test_delete_rowcount(self):
-         # WHERE matches 3, 3 rows deleted
-         department = employees_table.c.department
-         r = employees_table.delete(department=='C').execute()
--        print "expecting 3, dialect reports %s" % r.rowcount
-+        print("expecting 3, dialect reports %s" % r.rowcount)
-         assert r.rowcount == 3
-
-diff -r 9d0639b9d3be test/sql/test_selectable.py
---- a/test/sql/test_selectable.py      Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/sql/test_selectable.py      Sat Apr 27 19:42:17 2013 -0400
-@@ -174,11 +174,11 @@
-
-     def test_clone_append_column(self):
-         sel = select([literal_column('1').label('a')])
--        eq_(sel.c.keys(), ['a'])
-+        eq_(list(sel.c.keys()), ['a'])
-         cloned = visitors.ReplacingCloningVisitor().traverse(sel)
-         cloned.append_column(literal_column('2').label('b'))
-         cloned.append_column(func.foo())
--        eq_(cloned.c.keys(), ['a', 'b', 'foo()'])
-+        eq_(list(cloned.c.keys()), ['a', 'b', 'foo()'])
-
-     def test_append_column_after_replace_selectable(self):
-         basesel = select([literal_column('1').label('a')])
-@@ -362,10 +362,10 @@
-
-     def test_join(self):
-         a = join(table1, table2)
--        print str(a.select(use_labels=True))
-+        print(str(a.select(use_labels=True)))
-         b = table2.alias('b')
-         j = join(a, b)
--        print str(j)
-+        print(str(j))
-         criterion = a.c.table1_col1 == b.c.col2
-         self.assert_(criterion.compare(j.onclause))
-
-@@ -949,7 +949,7 @@
-                   primary_key=True), Column('x', Integer))
-         d = Table('d', meta, Column('id', Integer, ForeignKey('c.id'),
-                   primary_key=True), Column('x', Integer))
--        print list(a.join(b, a.c.x == b.c.id).primary_key)
-+        print(list(a.join(b, a.c.x == b.c.id).primary_key))
-         assert list(a.join(b, a.c.x == b.c.id).primary_key) == [a.c.id]
-         assert list(b.join(c, b.c.x == c.c.id).primary_key) == [b.c.id]
-         assert list(a.join(b).join(c, c.c.id == b.c.x).primary_key) \
-@@ -1618,7 +1618,7 @@
-     def test_names_overlap_label(self):
-         sel = self._names_overlap().apply_labels()
-         eq_(
--            sel.c.keys(),
-+            list(sel.c.keys()),
-             ['t1_x', 't2_x']
-         )
-         self._assert_result_keys(sel, ['t1_x', 't2_x'])
-@@ -1632,7 +1632,7 @@
-     def test_names_overlap_keys_dont_nolabel(self):
-         sel = self._names_overlap_keys_dont()
-         eq_(
--            sel.c.keys(),
-+            list(sel.c.keys()),
-             ['a', 'b']
-         )
-         self._assert_result_keys(sel, ['x'])
-@@ -1640,7 +1640,7 @@
-     def test_names_overlap_keys_dont_label(self):
-         sel = self._names_overlap_keys_dont().apply_labels()
-         eq_(
--            sel.c.keys(),
-+            list(sel.c.keys()),
-             ['t1_a', 't2_b']
-         )
-         self._assert_result_keys(sel, ['t1_x', 't2_x'])
-@@ -1654,7 +1654,7 @@
-     def test_labels_overlap_nolabel(self):
-         sel = self._labels_overlap()
-         eq_(
--            sel.c.keys(),
-+            list(sel.c.keys()),
-             ['x_id', 'id']
-         )
-         self._assert_result_keys(sel, ['x_id', 'id'])
-@@ -1663,7 +1663,7 @@
-         sel = self._labels_overlap().apply_labels()
-         t2 = sel.froms[1]
-         eq_(
--            sel.c.keys(),
-+            list(sel.c.keys()),
-             ['t_x_id', t2.c.id.anon_label]
-         )
-         self._assert_result_keys(sel, ['t_x_id', 'id_1'])
-@@ -1677,12 +1677,12 @@
-
-     def test_labels_overlap_keylabels_dont_nolabel(self):
-         sel = self._labels_overlap_keylabels_dont()
--        eq_(sel.c.keys(), ['a', 'b'])
-+        eq_(list(sel.c.keys()), ['a', 'b'])
-         self._assert_result_keys(sel, ['x_id', 'id'])
-
-     def test_labels_overlap_keylabels_dont_label(self):
-         sel = self._labels_overlap_keylabels_dont().apply_labels()
--        eq_(sel.c.keys(), ['t_a', 't_x_b'])
-+        eq_(list(sel.c.keys()), ['t_a', 't_x_b'])
-         self._assert_result_keys(sel, ['t_x_id', 'id_1'])
-
-     def _keylabels_overlap_labels_dont(self):
-@@ -1693,13 +1693,13 @@
-
-     def test_keylabels_overlap_labels_dont_nolabel(self):
-         sel = self._keylabels_overlap_labels_dont()
--        eq_(sel.c.keys(), ['x_id', 'id'])
-+        eq_(list(sel.c.keys()), ['x_id', 'id'])
-         self._assert_result_keys(sel, ['a', 'b'])
-
-     def test_keylabels_overlap_labels_dont_label(self):
-         sel = self._keylabels_overlap_labels_dont().apply_labels()
-         t2 = sel.froms[1]
--        eq_(sel.c.keys(), ['t_x_id', t2.c.id.anon_label])
-+        eq_(list(sel.c.keys()), ['t_x_id', t2.c.id.anon_label])
-         self._assert_result_keys(sel, ['t_a', 't_x_b'])
-         self._assert_subq_result_keys(sel, ['t_a', 't_x_b'])
-
-@@ -1711,14 +1711,14 @@
-
-     def test_keylabels_overlap_labels_overlap_nolabel(self):
-         sel = self._keylabels_overlap_labels_overlap()
--        eq_(sel.c.keys(), ['x_a', 'a'])
-+        eq_(list(sel.c.keys()), ['x_a', 'a'])
-         self._assert_result_keys(sel, ['x_id', 'id'])
-         self._assert_subq_result_keys(sel, ['x_id', 'id'])
-
-     def test_keylabels_overlap_labels_overlap_label(self):
-         sel = self._keylabels_overlap_labels_overlap().apply_labels()
-         t2 = sel.froms[1]
--        eq_(sel.c.keys(), ['t_x_a', t2.c.a.anon_label])
-+        eq_(list(sel.c.keys()), ['t_x_a', t2.c.a.anon_label])
-         self._assert_result_keys(sel, ['t_x_id', 'id_1'])
-         self._assert_subq_result_keys(sel, ['t_x_id', 'id_1'])
-
-@@ -1736,7 +1736,7 @@
-     def test_keys_overlap_names_dont_label(self):
-         sel = self._keys_overlap_names_dont().apply_labels()
-         eq_(
--            sel.c.keys(),
-+            list(sel.c.keys()),
-             ['t1_x', 't2_x']
-         )
-         self._assert_result_keys(sel, ['t1_a', 't2_b'])
-diff -r 9d0639b9d3be test/sql/test_types.py
---- a/test/sql/test_types.py   Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/sql/test_types.py   Sat Apr 27 19:42:17 2013 -0400
-@@ -141,22 +141,24 @@
-         eq_(types.Integer().python_type, int)
-         eq_(types.Numeric().python_type, decimal.Decimal)
-         eq_(types.Numeric(asdecimal=False).python_type, float)
--        # Py3K
--        #eq_(types.LargeBinary().python_type, bytes)
--        # Py2K
--        eq_(types.LargeBinary().python_type, str)
--        # end Py2K
-+# start Py3K
-+        eq_(types.LargeBinary().python_type, bytes)
-+# end Py3K
-+# start Py2K
-+#        eq_(types.LargeBinary().python_type, str)
-+# end Py2K
-         eq_(types.Float().python_type, float)
-         eq_(types.Interval().python_type, datetime.timedelta)
-         eq_(types.Date().python_type, datetime.date)
-         eq_(types.DateTime().python_type, datetime.datetime)
--        # Py3K
--        #eq_(types.String().python_type, unicode)
--        # Py2K
-+# start Py3K
-         eq_(types.String().python_type, str)
--        # end Py2K
--        eq_(types.Unicode().python_type, unicode)
--        eq_(types.String(convert_unicode=True).python_type, unicode)
-+# end Py3K
-+# start Py2K
-+#        eq_(types.String().python_type, str)
-+# end Py2K
-+        eq_(types.Unicode().python_type, str)
-+        eq_(types.String(convert_unicode=True).python_type, str)
-
-         assert_raises(
-             NotImplementedError,
-@@ -257,14 +259,14 @@
-     def test_processing(self):
-         users = self.tables.users
-         users.insert().execute(
--            user_id=2, goofy='jack', goofy2='jack', goofy4=u'jack',
--            goofy7=u'jack', goofy8=12, goofy9=12)
-+            user_id=2, goofy='jack', goofy2='jack', goofy4='jack',
-+            goofy7='jack', goofy8=12, goofy9=12)
-         users.insert().execute(
--            user_id=3, goofy='lala', goofy2='lala', goofy4=u'lala',
--            goofy7=u'lala', goofy8=15, goofy9=15)
-+            user_id=3, goofy='lala', goofy2='lala', goofy4='lala',
-+            goofy7='lala', goofy8=15, goofy9=15)
-         users.insert().execute(
--            user_id=4, goofy='fred', goofy2='fred', goofy4=u'fred',
--            goofy7=u'fred', goofy8=9, goofy9=9)
-+            user_id=4, goofy='fred', goofy2='fred', goofy4='fred',
-+            goofy7='fred', goofy8=9, goofy9=9)
-
-         l = users.select().order_by(users.c.user_id).execute().fetchall()
-         for assertstr, assertint, assertint2, row in zip(
-@@ -278,7 +280,7 @@
-             eq_(row[5], assertint)
-             eq_(row[6], assertint2)
-             for col in row[3], row[4]:
--                assert isinstance(col, unicode)
-+                assert isinstance(col, str)
-
-     def test_typedecorator_impl(self):
-         for impl_, exp, kw in [
-@@ -715,9 +717,9 @@
-                 expected
-             )
-
--    data = u"Alors vous imaginez ma surprise, au lever du jour, quand "\
--            u"une drôle de petite voix m’a réveillé. "\
--            u"Elle disait: « S’il vous plaît… dessine-moi un mouton! »"
-+    data = "Alors vous imaginez ma surprise, au lever du jour, quand "\
-+            "une drôle de petite voix m’a réveillé. "\
-+            "Elle disait: « S’il vous plaît… dessine-moi un mouton! »"
-
-     def test_unicode_warnings_typelevel_native_unicode(self):
-
-@@ -726,13 +728,14 @@
-         dialect = default.DefaultDialect()
-         dialect.supports_unicode_binds = True
-         uni = u.dialect_impl(dialect).bind_processor(dialect)
--        # Py3K
--        #assert_raises(exc.SAWarning, uni, b'x')
--        #assert isinstance(uni(unicodedata), str)
--        # Py2K
--        assert_raises(exc.SAWarning, uni, 'x')
--        assert isinstance(uni(unicodedata), unicode)
--        # end Py2K
-+# start Py3K
-+        assert_raises(exc.SAWarning, uni, b'x')
-+        assert isinstance(uni(unicodedata), str)
-+# end Py3K
-+# start Py2K
-+#        assert_raises(exc.SAWarning, uni, 'x')
-+#        assert isinstance(uni(unicodedata), unicode)
-+# end Py2K
-
-     def test_unicode_warnings_typelevel_sqla_unicode(self):
-         unicodedata = self.data
-@@ -740,13 +743,14 @@
-         dialect = default.DefaultDialect()
-         dialect.supports_unicode_binds = False
-         uni = u.dialect_impl(dialect).bind_processor(dialect)
--        # Py3K
--        #assert_raises(exc.SAWarning, uni, b'x')
--        #assert isinstance(uni(unicodedata), bytes)
--        # Py2K
--        assert_raises(exc.SAWarning, uni, 'x')
--        assert isinstance(uni(unicodedata), str)
--        # end Py2K
-+# start Py3K
-+        assert_raises(exc.SAWarning, uni, b'x')
-+        assert isinstance(uni(unicodedata), bytes)
-+# end Py3K
-+# start Py2K
-+#        assert_raises(exc.SAWarning, uni, 'x')
-+#        assert isinstance(uni(unicodedata), str)
-+# end Py2K
-
-         eq_(uni(unicodedata), unicodedata.encode('utf-8'))
-
-@@ -760,13 +764,14 @@
-         s = String()
-         uni = s.dialect_impl(dialect).bind_processor(dialect)
-         # this is not the unicode type - no warning
--        # Py3K
--        #uni(b'x')
--        #assert isinstance(uni(unicodedata), bytes)
--        # Py2K
--        uni('x')
--        assert isinstance(uni(unicodedata), str)
--        # end Py2K
-+# start Py3K
-+        uni(b'x')
-+        assert isinstance(uni(unicodedata), bytes)
-+# end Py3K
-+# start Py2K
-+#        uni('x')
-+#        assert isinstance(uni(unicodedata), str)
-+# end Py2K
-
-         eq_(uni(unicodedata), unicodedata.encode('utf-8'))
-
-@@ -1366,7 +1371,7 @@
-         metadata = self.metadata
-         t = self._fixture(metadata, Integer, 45)
-         val = testing.db.execute("select val from t").scalar()
--        assert isinstance(val, (int, long))
-+        assert isinstance(val, int)
-         eq_(val, 45)
-
-     @testing.provide_metadata
-diff -r 9d0639b9d3be test/sql/test_unicode.py
---- a/test/sql/test_unicode.py Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/sql/test_unicode.py Sat Apr 27 19:42:17 2013 -0400
-@@ -19,13 +19,13 @@
-
-         metadata = MetaData(unicode_bind)
-         t1 = Table('unitable1', metadata,
--            Column(u'méil', Integer, primary_key=True),
--            Column(u'\u6e2c\u8a66', Integer),
-+            Column('méil', Integer, primary_key=True),
-+            Column('\u6e2c\u8a66', Integer),
-             test_needs_fk=True,
-             )
--        t2 = Table(u'Unitéble2', metadata,
--            Column(u'méil', Integer, primary_key=True, key="a"),
--            Column(u'\u6e2c\u8a66', Integer, ForeignKey(u'unitable1.méil'),
-+        t2 = Table('Unitéble2', metadata,
-+            Column('méil', Integer, primary_key=True, key="a"),
-+            Column('\u6e2c\u8a66', Integer, ForeignKey('unitable1.méil'),
-                    key="b"
-                    ),
-                    test_needs_fk=True,
-@@ -33,27 +33,27 @@
-
-         # Few DBs support Unicode foreign keys
-         if testing.against('sqlite'):
--            t3 = Table(u'\u6e2c\u8a66', metadata,
--                       Column(u'\u6e2c\u8a66_id', Integer, primary_key=True,
-+            t3 = Table('\u6e2c\u8a66', metadata,
-+                       Column('\u6e2c\u8a66_id', Integer, primary_key=True,
-                               autoincrement=False),
--                       Column(u'unitable1_\u6e2c\u8a66', Integer,
--                              ForeignKey(u'unitable1.\u6e2c\u8a66')
-+                       Column('unitable1_\u6e2c\u8a66', Integer,
-+                              ForeignKey('unitable1.\u6e2c\u8a66')
-                               ),
--                       Column(u'Unitéble2_b', Integer,
--                              ForeignKey(u'Unitéble2.b')
-+                       Column('Unitéble2_b', Integer,
-+                              ForeignKey('Unitéble2.b')
-                               ),
--                       Column(u'\u6e2c\u8a66_self', Integer,
--                              ForeignKey(u'\u6e2c\u8a66.\u6e2c\u8a66_id')
-+                       Column('\u6e2c\u8a66_self', Integer,
-+                              ForeignKey('\u6e2c\u8a66.\u6e2c\u8a66_id')
-                               ),
-                        test_needs_fk=True,
-                        )
-         else:
--            t3 = Table(u'\u6e2c\u8a66', metadata,
--                       Column(u'\u6e2c\u8a66_id', Integer, primary_key=True,
-+            t3 = Table('\u6e2c\u8a66', metadata,
-+                       Column('\u6e2c\u8a66_id', Integer, primary_key=True,
-                               autoincrement=False),
--                       Column(u'unitable1_\u6e2c\u8a66', Integer),
--                       Column(u'Unitéble2_b', Integer),
--                       Column(u'\u6e2c\u8a66_self', Integer),
-+                       Column('unitable1_\u6e2c\u8a66', Integer),
-+                       Column('Unitéble2_b', Integer),
-+                       Column('\u6e2c\u8a66_self', Integer),
-                        test_needs_fk=True,
-                        )
-         metadata.create_all()
-@@ -72,42 +72,42 @@
-         del unicode_bind
-
-     def test_insert(self):
--        t1.insert().execute({u'méil':1, u'\u6e2c\u8a66':5})
-+        t1.insert().execute({'méil':1, '\u6e2c\u8a66':5})
-         t2.insert().execute({'a':1, 'b':1})
--        t3.insert().execute({u'\u6e2c\u8a66_id': 1,
--                             u'unitable1_\u6e2c\u8a66': 5,
--                             u'Unitéble2_b': 1,
--                             u'\u6e2c\u8a66_self': 1})
-+        t3.insert().execute({'\u6e2c\u8a66_id': 1,
-+                             'unitable1_\u6e2c\u8a66': 5,
-+                             'Unitéble2_b': 1,
-+                             '\u6e2c\u8a66_self': 1})
-
-         assert t1.select().execute().fetchall() == [(1, 5)]
-         assert t2.select().execute().fetchall() == [(1, 1)]
-         assert t3.select().execute().fetchall() == [(1, 5, 1, 1)]
-
-     def test_reflect(self):
--        t1.insert().execute({u'méil':2, u'\u6e2c\u8a66':7})
-+        t1.insert().execute({'méil':2, '\u6e2c\u8a66':7})
-         t2.insert().execute({'a':2, 'b':2})
--        t3.insert().execute({u'\u6e2c\u8a66_id': 2,
--                             u'unitable1_\u6e2c\u8a66': 7,
--                             u'Unitéble2_b': 2,
--                             u'\u6e2c\u8a66_self': 2})
-+        t3.insert().execute({'\u6e2c\u8a66_id': 2,
-+                             'unitable1_\u6e2c\u8a66': 7,
-+                             'Unitéble2_b': 2,
-+                             '\u6e2c\u8a66_self': 2})
-
-         meta = MetaData(unicode_bind)
-         tt1 = Table(t1.name, meta, autoload=True)
-         tt2 = Table(t2.name, meta, autoload=True)
-         tt3 = Table(t3.name, meta, autoload=True)
-
--        tt1.insert().execute({u'méil':1, u'\u6e2c\u8a66':5})
--        tt2.insert().execute({u'méil':1, u'\u6e2c\u8a66':1})
--        tt3.insert().execute({u'\u6e2c\u8a66_id': 1,
--                              u'unitable1_\u6e2c\u8a66': 5,
--                              u'Unitéble2_b': 1,
--                              u'\u6e2c\u8a66_self': 1})
-+        tt1.insert().execute({'méil':1, '\u6e2c\u8a66':5})
-+        tt2.insert().execute({'méil':1, '\u6e2c\u8a66':1})
-+        tt3.insert().execute({'\u6e2c\u8a66_id': 1,
-+                              'unitable1_\u6e2c\u8a66': 5,
-+                              'Unitéble2_b': 1,
-+                              '\u6e2c\u8a66_self': 1})
-
--        self.assert_(tt1.select(order_by=desc(u'méil')).execute().fetchall() ==
-+        self.assert_(tt1.select(order_by=desc('méil')).execute().fetchall() ==
-                      [(2, 7), (1, 5)])
--        self.assert_(tt2.select(order_by=desc(u'méil')).execute().fetchall() ==
-+        self.assert_(tt2.select(order_by=desc('méil')).execute().fetchall() ==
-                      [(2, 2), (1, 1)])
--        self.assert_(tt3.select(order_by=desc(u'\u6e2c\u8a66_id')).
-+        self.assert_(tt3.select(order_by=desc('\u6e2c\u8a66_id')).
-                      execute().fetchall() ==
-                      [(2, 7, 2, 2), (1, 5, 1, 1)])
-         meta.drop_all()
-@@ -117,7 +117,7 @@
-     def test_default_exec(self):
-         metadata = MetaData(testing.db)
-         t1 = Table('t1', metadata,
--            Column(u'special_col', Integer, Sequence('special_col'), primary_key=True),
-+            Column('special_col', Integer, Sequence('special_col'), primary_key=True),
-             Column('data', String(50)) # to appease SQLite without DEFAULT VALUES
-             )
-         metadata.create_all()
-@@ -128,8 +128,8 @@
-             # reset the identifier preparer, so that we can force it to cache
-             # a unicode identifier
-             engine.dialect.identifier_preparer = engine.dialect.preparer(engine.dialect)
--            select([column(u'special_col')]).select_from(t1).execute().close()
--            assert isinstance(engine.dialect.identifier_preparer.format_sequence(Sequence('special_col')), unicode)
-+            select([column('special_col')]).select_from(t1).execute().close()
-+            assert isinstance(engine.dialect.identifier_preparer.format_sequence(Sequence('special_col')), str)
-
-             # now execute, run the sequence.  it should run in u"Special_col.nextid" or similar as
-             # a unicode object; cx_oracle asserts that this is None or a String (postgresql lets it pass thru).
-diff -r 9d0639b9d3be test/sql/test_update.py
---- a/test/sql/test_update.py  Sat Apr 27 17:51:52 2013 -0400
-+++ b/test/sql/test_update.py  Sat Apr 27 19:42:17 2013 -0400
-@@ -242,7 +242,7 @@
-             'WHERE '
-                 'users.id = addresses.user_id AND '
-                 'addresses.email_address = :email_address_1',
--            checkparams={u'email_address_1': 'e1', 'name': 'newname'})
-+            checkparams={'email_address_1': 'e1', 'name': 'newname'})
-
-     def test_render_multi_table(self):
-         users = self.tables.users
-@@ -250,8 +250,8 @@
-         dingalings = self.tables.dingalings
-
-         checkparams = {
--            u'email_address_1': 'e1',
--            u'id_1': 2,
-+            'email_address_1': 'e1',
-+            'id_1': 2,
-             'name': 'newname'
-         }
-
-@@ -285,15 +285,15 @@
-             'WHERE '
-                 'users.id = addresses.user_id AND '
-                 'addresses.email_address = %s',
--            checkparams={u'email_address_1': 'e1', 'name': 'newname'},
-+            checkparams={'email_address_1': 'e1', 'name': 'newname'},
-             dialect=mysql.dialect())
-
-     def test_render_subquery(self):
-         users, addresses = self.tables.users, self.tables.addresses
-
-         checkparams = {
--            u'email_address_1': 'e1',
--            u'id_1': 7,
-+            'email_address_1': 'e1',
-+            'id_1': 7,
-             'name': 'newname'
-         }
-