]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
hstores are text, and in py3k they seem to be implcitly unicode. so
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 29 May 2013 22:08:28 +0000 (18:08 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 29 May 2013 22:34:29 +0000 (18:34 -0400)
    add unicode encoding for py2k for the non-native hstore, pullreq for
    native psycopg2 support coming....

lib/sqlalchemy/dialects/postgresql/hstore.py
test/dialect/test_postgresql.py

index e555a1afd9ae9b74fa98a483cd0f4c3a2ec0691f..b2150bc4495e66103736cfcaf160576b9b18c43b 100644 (file)
@@ -260,19 +260,35 @@ class HSTORE(sqltypes.Concatenable, sqltypes.TypeEngine):
                 _adapt_expression(self, op, other_comparator)
 
     def bind_processor(self, dialect):
-        def process(value):
-            if isinstance(value, dict):
-                return _serialize_hstore(value)
-            else:
-                return value
+        if util.py2k:
+            encoding = dialect.encoding
+            def process(value):
+                if isinstance(value, dict):
+                    return _serialize_hstore(value).encode(encoding)
+                else:
+                    return value
+        else:
+            def process(value):
+                if isinstance(value, dict):
+                    return _serialize_hstore(value)
+                else:
+                    return value
         return process
 
     def result_processor(self, dialect, coltype):
-        def process(value):
-            if value is not None:
-                return _parse_hstore(value)
-            else:
-                return value
+        if util.py2k:
+            encoding = dialect.encoding
+            def process(value):
+                if value is not None:
+                    return _parse_hstore(value.decode(encoding))
+                else:
+                    return value
+        else:
+            def process(value):
+                if value is not None:
+                    return _parse_hstore(value)
+                else:
+                    return value
         return process
 
 
index 4fd5bc9c123e71dc11bf93646725a004f60ec13d..86e10c06edda21474c9f51092e0ccd9627d174f0 100644 (file)
@@ -3206,3 +3206,28 @@ class HStoreRoundTripTest(fixtures.TablesTest):
     def test_fixed_round_trip_native(self):
         engine = testing.db
         self._test_fixed_round_trip(engine)
+
+    def _test_unicode_round_trip(self, engine):
+        s = select([
+                hstore(
+                    array([u'réveillé', u'drôle', u'S’il']),
+                    array([u'réveillé', u'drôle', u'S’il'])
+                )
+            ])
+        eq_(
+            engine.scalar(s),
+            {
+                u'réveillé': u'réveillé',
+                u'drôle': u'drôle',
+                u'S’il': u'S’il'
+            }
+        )
+
+    def test_unicode_round_trip_python(self):
+        engine = self._non_native_engine()
+        self._test_unicode_round_trip(engine)
+
+    @testing.only_on("postgresql+psycopg2")
+    def test_unicode_round_trip_native(self):
+        engine = testing.db
+        self._test_unicode_round_trip(engine)