From aeaab500433e1d9698959394982974d5f55c9b71 Mon Sep 17 00:00:00 2001 From: Ben Fasoli Date: Wed, 25 Mar 2020 19:35:36 -0700 Subject: [PATCH] Adds support to serialize `dict` as JSON There are likely some vendor-specific enhancements (such as `JSONB` in PostgreSQL) but the current method of type guessing doesn't know anything about the underlying database. --- dataset/types.py | 5 ++++- test/test_dataset.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/dataset/types.py b/dataset/types.py index 320bc48..97c5b18 100644 --- a/dataset/types.py +++ b/dataset/types.py @@ -1,7 +1,7 @@ from datetime import datetime, date from sqlalchemy import Integer, UnicodeText, Float, BigInteger -from sqlalchemy import Boolean, Date, DateTime, Unicode +from sqlalchemy import Boolean, Date, DateTime, Unicode, JSON from sqlalchemy.types import TypeEngine @@ -15,6 +15,7 @@ class Types(object): boolean = Boolean date = Date datetime = DateTime + json = JSON def guess(self, sample): """Given a single sample, guess the column type for the field. @@ -34,4 +35,6 @@ class Types(object): return self.datetime elif isinstance(sample, date): return self.date + elif isinstance(sample, dict): + return self.json return self.text diff --git a/test/test_dataset.py b/test/test_dataset.py index e5cecd6..fb21952 100644 --- a/test/test_dataset.py +++ b/test/test_dataset.py @@ -192,6 +192,20 @@ class TableTestCase(unittest.TestCase): ) assert len(self.tbl) == len(TEST_DATA) + 1, len(self.tbl) + def test_insert_json(self): + last_id = self.tbl.insert({ + 'date': datetime(2011, 1, 2), + 'temperature': -10, + 'place': 'Berlin', + 'info': { + 'currency': 'EUR', + 'language': 'German', + 'population': 3292365 + } + }) + assert len(self.tbl) == len(TEST_DATA) + 1, len(self.tbl) + assert self.tbl.find_one(id=last_id)['place'] == 'Berlin' + def test_upsert(self): self.tbl.upsert({ 'date': datetime(2011, 1, 2),