changeset 70eb48aa2f0a in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset&node=70eb48aa2f0a
description:
        Use JSONB to store Dict field on PostgreSQL backend

        issue10858
        review379371002
diffstat:

 CHANGELOG                              |   2 +
 trytond/backend/postgresql/database.py |   7 +++--
 trytond/backend/sqlite/database.py     |   3 +-
 trytond/model/fields/dict.py           |   2 +-
 trytond/tests/field_dict.py            |   9 +++---
 trytond/tests/test_field_dict.py       |  45 ++++++---------------------------
 6 files changed, 23 insertions(+), 45 deletions(-)

diffs (169 lines):

diff -r 3aa3a4d4dcf3 -r 70eb48aa2f0a CHANGELOG
--- a/CHANGELOG Mon Nov 08 19:22:35 2021 +0100
+++ b/CHANGELOG Mon Nov 08 19:27:03 2021 +0100
@@ -1,3 +1,5 @@
+* Use JSONB to store Dict field on PostgreSQL backend
+
 Version 6.2.0 - 2021-11-01
 * Bug fixes (see mercurial logs for details)
 * Allow to cast to date with timezone
diff -r 3aa3a4d4dcf3 -r 70eb48aa2f0a trytond/backend/postgresql/database.py
--- a/trytond/backend/postgresql/database.py    Mon Nov 08 19:22:35 2021 +0100
+++ b/trytond/backend/postgresql/database.py    Mon Nov 08 19:27:03 2021 +0100
@@ -198,13 +198,14 @@
     flavor = Flavor(ilike=True)
 
     TYPES_MAPPING = {
-        'INTEGER': SQLType('INT4', 'INT4'),
         'BIGINT': SQLType('INT8', 'INT8'),
-        'FLOAT': SQLType('FLOAT8', 'FLOAT8'),
         'BLOB': SQLType('BYTEA', 'BYTEA'),
         'DATETIME': SQLType('TIMESTAMP', 'TIMESTAMP(0)'),
+        'FLOAT': SQLType('FLOAT8', 'FLOAT8'),
+        'FULLTEXT': SQLType('TSVECTOR', 'TSVECTOR'),
+        'INTEGER': SQLType('INT4', 'INT4'),
+        'JSON': SQLType('JSONB', 'JSONB'),
         'TIMESTAMP': SQLType('TIMESTAMP', 'TIMESTAMP(6)'),
-        'FULLTEXT': SQLType('TSVECTOR', 'TSVECTOR'),
         }
 
     def __new__(cls, name=_default_name):
diff -r 3aa3a4d4dcf3 -r 70eb48aa2f0a trytond/backend/sqlite/database.py
--- a/trytond/backend/sqlite/database.py        Mon Nov 08 19:22:35 2021 +0100
+++ b/trytond/backend/sqlite/database.py        Mon Nov 08 19:27:03 2021 +0100
@@ -334,10 +334,11 @@
     IN_MAX = 200
 
     TYPES_MAPPING = {
-        'DATETIME': SQLType('TIMESTAMP', 'TIMESTAMP'),
         'BIGINT': SQLType('INTEGER', 'INTEGER'),
         'BOOL': SQLType('BOOLEAN', 'BOOLEAN'),
+        'DATETIME': SQLType('TIMESTAMP', 'TIMESTAMP'),
         'FULLTEXT': SQLType('TEXT', 'TEXT'),
+        'JSON': SQLType('TEXT', 'TEXT'),
         }
 
     def __new__(cls, name=_default_name):
diff -r 3aa3a4d4dcf3 -r 70eb48aa2f0a trytond/model/fields/dict.py
--- a/trytond/model/fields/dict.py      Mon Nov 08 19:22:35 2021 +0100
+++ b/trytond/model/fields/dict.py      Mon Nov 08 19:27:03 2021 +0100
@@ -21,7 +21,7 @@
 class Dict(Field):
     'Define dict field.'
     _type = 'dict'
-    _sql_type = 'TEXT'
+    _sql_type = 'JSON'
     _py_type = dict
 
     def __init__(self, schema_model, string='', help='', required=False,
diff -r 3aa3a4d4dcf3 -r 70eb48aa2f0a trytond/tests/field_dict.py
--- a/trytond/tests/field_dict.py       Mon Nov 08 19:22:35 2021 +0100
+++ b/trytond/tests/field_dict.py       Mon Nov 08 19:27:03 2021 +0100
@@ -34,10 +34,11 @@
     dico = fields.Dict(None, 'Test Dict', required=True)
 
 
-class DictJSONB(ModelSQL):
-    'Dict JSONB'
-    __name__ = 'test.dict_jsonb'
+class DictText(ModelSQL):
+    'Dict TEXT'
+    __name__ = 'test.dict_text'
     dico = fields.Dict('test.dict.schema', 'Test Dict')
+    dico._sql_type = 'TEXT'
 
 
 class DictNoSchema(ModelSQL):
@@ -69,7 +70,7 @@
         Dict,
         DictDefault,
         DictRequired,
-        DictJSONB,
+        DictText,
         DictNoSchema,
         DictUnaccentedOn,
         DictUnaccentedOff,
diff -r 3aa3a4d4dcf3 -r 70eb48aa2f0a trytond/tests/test_field_dict.py
--- a/trytond/tests/test_field_dict.py  Mon Nov 08 19:22:35 2021 +0100
+++ b/trytond/tests/test_field_dict.py  Mon Nov 08 19:27:03 2021 +0100
@@ -8,7 +8,6 @@
 from trytond.pool import Pool
 from trytond.tests.test_tryton import activate_module, with_transaction
 from trytond.tests.test_tryton import ExtensionTestCase
-from trytond.transaction import Transaction
 
 
 class FieldDictTestCase(unittest.TestCase):
@@ -48,11 +47,6 @@
                         'fr: France'),
                     }])
 
-    def set_jsonb(self, table):
-        cursor = Transaction().connection.cursor()
-        cursor.execute('ALTER TABLE "%s" '
-            'ALTER COLUMN dico TYPE json USING dico::json' % table)
-
     @with_transaction()
     def test_create(self):
         "Test create dict"
@@ -167,16 +161,9 @@
                         }])
 
     @with_transaction()
-    @unittest.skipIf(
-        backend.name != 'postgresql', 'jsonb only supported by postgresql')
-    def test_create_jsonb(self):
-        "Test create dict as jsonb"
-        connection = Transaction().connection
-        if backend.Database().get_version(connection) < (9, 2):
-            return
-
-        Dict = Pool().get('test.dict_jsonb')
-        self.set_jsonb(Dict._table)
+    def test_create_text(self):
+        "Test create dict as text"
+        Dict = Pool().get('test.dict_text')
 
         dict_, = Dict.create([{
                     'dico': {'a': 1, 'b': 2},
@@ -214,16 +201,9 @@
         self.assertDictEqual(dict_.dico, {'y': 1})
 
     @with_transaction()
-    @unittest.skipIf(
-        backend.name != 'postgresql', 'jsonb only supported by postgresql')
-    def test_write_jsonb(self):
-        "Test write dict as jsonb"
-        connection = Transaction().connection
-        if backend.Database().get_version(connection) < (9, 2):
-            return
-
-        Dict = Pool().get('test.dict_jsonb')
-        self.set_jsonb(Dict._table)
+    def test_write_text(self):
+        "Test write dict as text"
+        Dict = Pool().get('test.dict_text')
         dict_, = Dict.create([{
                     'dico': {'a': 1, 'b': 2},
                     }])
@@ -827,17 +807,10 @@
         self.assertListEqual(dicts_b_b, [])
 
     @with_transaction()
-    @unittest.skipIf(
-        backend.name != 'postgresql', 'jsonb only supported by postgresql')
-    def test_search_element_jsonb(self):
-        "Test search dict element on jsonb"
-        connection = Transaction().connection
-        if backend.Database().get_version(connection) < (9, 2):
-            return
-
+    def test_search_element_text(self):
+        "Test search dict element on text"
         pool = Pool()
-        Dict = pool.get('test.dict_noschema')
-        self.set_jsonb(Dict._table)
+        Dict = pool.get('test.dict_text')
         dict_, = Dict.create([{
                     'dico': {'a': 'Foo'},
                     }])

Reply via email to