]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- unicode literals need to just be handled differently if they have utf-8
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 4 May 2013 18:59:26 +0000 (14:59 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 4 May 2013 18:59:26 +0000 (14:59 -0400)
encoded in them vs. unicode escaping.  not worth figuring out how to combine
these right now

lib/sqlalchemy/dialects/sqlite/base.py
lib/sqlalchemy/sql/compiler.py
lib/sqlalchemy/util/__init__.py
lib/sqlalchemy/util/compat.py
test/sql/test_compiler.py
test/sql/test_unicode.py

index d742a71b5ec50c4a5eeafd1a3ca012ffe392c88c..1ca8f4e64f0a9ec02eed8615aa81c1a4eeb4f0b1 100644 (file)
@@ -812,7 +812,7 @@ class SQLiteDialect(default.DefaultDialect):
             coltype = sqltypes.NullType()
 
         if default is not None:
-            default = str(default)
+            default = util.text_type(default)
 
         return {
             'name': name,
index d51dd625a448bc74651d56e8fe96f225910d95e0..c3aea159a2bb56ca8333922621a09054c6ee1a95 100644 (file)
@@ -1868,11 +1868,11 @@ class DDLCompiler(engine.Compiled):
                     first_pk = True
             except exc.CompileError as ce:
                 util.raise_from_cause(
-                    exc.CompileError(util.u("(in table '%s', column '%s'): %s" % (
+                    exc.CompileError(util.u("(in table '%s', column '%s'): %s") % (
                                                 table.description,
                                                 column.name,
                                                 ce.args[0]
-                                            ))))
+                                            )))
 
         const = self.create_table_constraints(table)
         if const:
@@ -2344,7 +2344,7 @@ class IdentifierPreparer(object):
         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(str(value))
+                or not self.legal_characters.match(util.text_type(value))
                 or (lc_value != value))
 
     def quote_schema(self, schema, force):
index 72baa9f368575dae69a67222237215a025ab1ef9..b1f1a2db693abc3e8e295d0850be41edc5c203c9 100644 (file)
@@ -8,7 +8,7 @@ from .compat import callable, cmp, reduce,  \
     threading, py3k, py2k, jython, pypy, cpython, win32, \
     pickle, dottedgetter, parse_qsl, namedtuple, next, WeakSet, reraise, \
     raise_from_cause, text_type, string_types, int_types, binary_type, \
-    quote_plus, with_metaclass, print_, itertools_filterfalse, u, b,\
+    quote_plus, with_metaclass, print_, itertools_filterfalse, u, ue, b,\
     unquote_plus
 
 from ._collections import KeyedTuple, ImmutableContainer, immutabledict, \
index bc7a0fe2136d529da1450aa91bfbb5fbe35261fe..94b35f0195b52412233390f9c3a59d81cfa68946 100644 (file)
@@ -46,6 +46,9 @@ if py3k:
     def u(s):
         return s
 
+    def ue(s):
+        return s
+
     def b(s):
         return s.encode("latin-1")
 
@@ -79,6 +82,13 @@ else:
         return (ord(byte) for byte in buf)
 
     def u(s):
+        # this differs from what six does, which doesn't support non-ASCII
+        # strings - we only use u() with
+        # literal source strings, and all our source files with non-ascii
+        # in them (all are tests) are utf-8 encoded.
+        return unicode(s, "utf-8")
+
+    def ue(s):
         return unicode(s, "unicode_escape")
 
     def b(s):
index e3f7df70261fb917df7701dcfc4690d01ef63f4f..9cb0e6bbe8c2ad0573e4039dd99f64f773c448d0 100644 (file)
@@ -20,6 +20,7 @@ from sqlalchemy import Integer, String, MetaData, Table, Column, select, \
     intersect, union_all, Boolean, distinct, join, outerjoin, asc, desc,\
     over, subquery, case
 import decimal
+from sqlalchemy.util import u
 from sqlalchemy import exc, sql, util, types, schema
 from sqlalchemy.sql import table, column, label
 from sqlalchemy.sql.expression import ClauseList, _literal_as_text, HasPrefixes
@@ -2680,11 +2681,11 @@ class DDLTest(fixtures.TestBase, AssertsCompiledSQL):
     def test_reraise_of_column_spec_issue_unicode(self):
         MyType = self._illegal_type_fixture()
         t1 = Table('t', MetaData(),
-            Column('méil', MyType())
+            Column(u('méil'), MyType())
         )
         assert_raises_message(
             exc.CompileError,
-            r"\(in table 't', column 'méil'\): Couldn't compile type",
+            u(r"\(in table 't', column 'méil'\): Couldn't compile type"),
             schema.CreateTable(t1).compile
         )
 
index 2ab081dade70aa2102f2732a6f1f97b6f6051841..ffcef903f3be847f2e48d0e63bec402cf52247e3 100644 (file)
@@ -7,6 +7,7 @@ from sqlalchemy import testing
 from sqlalchemy.testing.engines import utf8_engine
 from sqlalchemy.sql import column
 from sqlalchemy.testing.schema import Table, Column
+from sqlalchemy.util import u, ue
 
 class UnicodeSchemaTest(fixtures.TestBase):
     __requires__ = ('unicode_ddl',)
@@ -18,14 +19,14 @@ class UnicodeSchemaTest(fixtures.TestBase):
         unicode_bind = utf8_engine()
 
         metadata = MetaData(unicode_bind)
-        t1 = Table('unitable1', metadata,
-            Column('méil', Integer, primary_key=True),
-            Column('\u6e2c\u8a66', Integer),
+        t1 = Table(u('unitable1'), metadata,
+            Column(u('méil'), Integer, primary_key=True),
+            Column(ue('\u6e2c\u8a66'), Integer),
             test_needs_fk=True,
             )
-        t2 = Table('Unitéble2', metadata,
-            Column('méil', Integer, primary_key=True, key="a"),
-            Column('\u6e2c\u8a66', Integer, ForeignKey('unitable1.méil'),
+        t2 = Table(u('Unitéble2'), metadata,
+            Column(u('méil'), Integer, primary_key=True, key="a"),
+            Column(ue('\u6e2c\u8a66'), Integer, ForeignKey(u('unitable1.méil')),
                    key="b"
                    ),
                    test_needs_fk=True,
@@ -33,27 +34,27 @@ class UnicodeSchemaTest(fixtures.TestBase):
 
         # Few DBs support Unicode foreign keys
         if testing.against('sqlite'):
-            t3 = Table('\u6e2c\u8a66', metadata,
-                       Column('\u6e2c\u8a66_id', Integer, primary_key=True,
+            t3 = Table(ue('\u6e2c\u8a66'), metadata,
+                       Column(ue('\u6e2c\u8a66_id'), Integer, primary_key=True,
                               autoincrement=False),
-                       Column('unitable1_\u6e2c\u8a66', Integer,
-                              ForeignKey('unitable1.\u6e2c\u8a66')
+                       Column(ue('unitable1_\u6e2c\u8a66'), Integer,
+                              ForeignKey(ue('unitable1.\u6e2c\u8a66'))
                               ),
-                       Column('Unitéble2_b', Integer,
-                              ForeignKey('Unitéble2.b')
+                       Column(u('Unitéble2_b'), Integer,
+                              ForeignKey(u('Unitéble2.b'))
                               ),
-                       Column('\u6e2c\u8a66_self', Integer,
-                              ForeignKey('\u6e2c\u8a66.\u6e2c\u8a66_id')
+                       Column(ue('\u6e2c\u8a66_self'), Integer,
+                              ForeignKey(ue('\u6e2c\u8a66.\u6e2c\u8a66_id'))
                               ),
                        test_needs_fk=True,
                        )
         else:
-            t3 = Table('\u6e2c\u8a66', metadata,
-                       Column('\u6e2c\u8a66_id', Integer, primary_key=True,
+            t3 = Table(ue('\u6e2c\u8a66'), metadata,
+                       Column(ue('\u6e2c\u8a66_id'), Integer, primary_key=True,
                               autoincrement=False),
-                       Column('unitable1_\u6e2c\u8a66', Integer),
-                       Column('Unitéble2_b', Integer),
-                       Column('\u6e2c\u8a66_self', Integer),
+                       Column(ue('unitable1_\u6e2c\u8a66'), Integer),
+                       Column(u('Unitéble2_b'), Integer),
+                       Column(ue('\u6e2c\u8a66_self'), Integer),
                        test_needs_fk=True,
                        )
         metadata.create_all()
@@ -72,42 +73,42 @@ class UnicodeSchemaTest(fixtures.TestBase):
         del unicode_bind
 
     def test_insert(self):
-        t1.insert().execute({'méil':1, '\u6e2c\u8a66':5})
-        t2.insert().execute({'a':1, 'b':1})
-        t3.insert().execute({'\u6e2c\u8a66_id': 1,
-                             'unitable1_\u6e2c\u8a66': 5,
-                             'Unitéble2_b': 1,
-                             '\u6e2c\u8a66_self': 1})
+        t1.insert().execute({u('méil'):1, ue('\u6e2c\u8a66'):5})
+        t2.insert().execute({u('a'):1, u('b'):1})
+        t3.insert().execute({ue('\u6e2c\u8a66_id'): 1,
+                             ue('unitable1_\u6e2c\u8a66'): 5,
+                             u('Unitéble2_b'): 1,
+                             ue('\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({'méil':2, '\u6e2c\u8a66':7})
-        t2.insert().execute({'a':2, 'b':2})
-        t3.insert().execute({'\u6e2c\u8a66_id': 2,
-                             'unitable1_\u6e2c\u8a66': 7,
-                             'Unitéble2_b': 2,
-                             '\u6e2c\u8a66_self': 2})
+        t1.insert().execute({u('méil'):2, ue('\u6e2c\u8a66'):7})
+        t2.insert().execute({u('a'):2, u('b'):2})
+        t3.insert().execute({ue('\u6e2c\u8a66_id'): 2,
+                             ue('unitable1_\u6e2c\u8a66'): 7,
+                             u('Unitéble2_b'): 2,
+                             ue('\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({'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})
+        tt1.insert().execute({u('méil'):1, ue('\u6e2c\u8a66'):5})
+        tt2.insert().execute({u('méil'):1, ue('\u6e2c\u8a66'):1})
+        tt3.insert().execute({ue('\u6e2c\u8a66_id'): 1,
+                              ue('unitable1_\u6e2c\u8a66'): 5,
+                              u('Unitéble2_b'): 1,
+                              ue('\u6e2c\u8a66_self'): 1})
 
-        self.assert_(tt1.select(order_by=desc('méil')).execute().fetchall() ==
+        self.assert_(tt1.select(order_by=desc(u('méil'))).execute().fetchall() ==
                      [(2, 7), (1, 5)])
-        self.assert_(tt2.select(order_by=desc('méil')).execute().fetchall() ==
+        self.assert_(tt2.select(order_by=desc(u('méil'))).execute().fetchall() ==
                      [(2, 2), (1, 1)])
-        self.assert_(tt3.select(order_by=desc('\u6e2c\u8a66_id')).
+        self.assert_(tt3.select(order_by=desc(ue('\u6e2c\u8a66_id'))).
                      execute().fetchall() ==
                      [(2, 7, 2, 2), (1, 5, 1, 1)])
         meta.drop_all()