Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating JSON type Column in SQLite with sqlalchemy

Is it possible to create JSON type Column in SQLite with sqlalchemy? I've tried

import sqlalchemy.types as types
...
myColumn = Column(types.JSON())

and

from sqlalchemy import JSON
...
mycolumn = Column(JSON) 

Both get error message:

Compiler can't render element of type

Wondering if there is any solution in sqlalchemy or I should just change into SQL instead. Thanks in advance.

[Updates] SQLite version 3.16.0

like image 731
Satty Avatar asked Oct 12 '17 14:10

Satty


3 Answers

My solution is:

import json
from sqlalchemy import TypeDecorator, types

class Json(TypeDecorator):

    @property
    def python_type(self):
        return object

    impl = types.String

    def process_bind_param(self, value, dialect):
        return json.dumps(value)

    def process_literal_param(self, value, dialect):
        return value

    def process_result_value(self, value, dialect):
        try:
            return json.loads(value)
        except (ValueError, TypeError):
            return None

...

myColumn = Column("name", Json)

For more information: TypeDecorator

like image 60
Xiwei Wang Avatar answered Oct 06 '22 13:10

Xiwei Wang


JSON was not added to SQLite until version 3.9. You'll either need to upgrade your SQLite or convert your json to a string and save it as such, while converting it back to a json object when you pull it out.

like image 44
Martin Lear Avatar answered Oct 06 '22 13:10

Martin Lear


SQLAlchemy 1.3 includes support for SQLite JSON extension, so don't forget to upgrade:

pip install --user -U SQLAlchemy

The dialect specific type sqlite.JSON implements JSON member access, usable through the base type types.JSON as well.

like image 24
theotheo Avatar answered Oct 06 '22 13:10

theotheo