Python 使用原始SQL时反序列化SQLAlchemy中的JSON
我在一个文本列中存储了一个带有JSON的表:Python 使用原始SQL时反序列化SQLAlchemy中的JSON,python,sqlalchemy,Python,Sqlalchemy,我在一个文本列中存储了一个带有JSON的表: import json from sqlalchemy import create_engine, Column, text, Integer, TEXT, TypeDecorator from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker engine = create_engine('sqlite:///:me
import json
from sqlalchemy import create_engine, Column, text, Integer, TEXT, TypeDecorator
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
engine = create_engine('sqlite:///:memory:')
engine.execute("create table t (t_id int not null primary key, attrs text not null)")
engine.execute("insert into t values (1, '{\"a\": 1, \"b\": 2}')")
Session = sessionmaker(bind=engine)
我在SQLAlchemy中定义了到该表的映射,使用了SQLAlchemy文档中在“”下定义的自定义类型:
如果我查询所有T
s,attrs
将从JSON反序列化:
session = Session()
t = session.query(T).first()
assert type(t.attrs) == dict, repr(t.attrs)
但如果我使用文本查询/原始SQL,它不会反序列化:
session = Session()
t = session.query(T).from_statement(text('select * from t')).first()
assert type(t.attrs) == dict, repr(t.attrs) # AssertionError: u'{"a": 1, "b": 2}'
使用原始SQL查询时,如何使SQLAlchemy反序列化attrs
列?
与其他数据库(MySQL、Postgres)的行为相同。我正在使用的数据库(MySQL 5.5)不支持本机JSON类型,因此更改列类型不是一个选项。您可以使用以下命令来判断(由生成的)列类型:
或者,对于SQLAlchemycolumns()
也接受关键字参数,允许使用“快捷方式”形式定义列的类型,例如在本例中为stmt.columns(attrs=JSONEncodedDict)
。
session = Session()
t = session.query(T).from_statement(text('select * from t')).first()
assert type(t.attrs) == dict, repr(t.attrs) # AssertionError: u'{"a": 1, "b": 2}'
from sqlalchemy import inspect
session = Session()
stmt = text('select * from t').columns(*inspect(T).columns)
t = session.query(T).from_statement(stmt).first()
assert type(t.attrs) == dict, repr(t.attrs)
from sqlalchemy import inspect
session = Session()
typemap = {c.name: c.type for c in inspect(T).columns}
stmt = text('select * from t', typemap=typemap)
t = session.query(T).from_statement(stmt).first()
assert type(t.attrs) == dict, repr(t.attrs)