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'},
}])