Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用原始SQL时反序列化SQLAlchemy中的JSON_Python_Sqlalchemy - Fatal编程技术网

Python 使用原始SQL时反序列化SQLAlchemy中的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

我在一个文本列中存储了一个带有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:///: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类型,因此更改列类型不是一个选项。

您可以使用以下命令来判断(由生成的)列类型:

或者,对于SQLAlchemy
columns()
也接受关键字参数,允许使用“快捷方式”形式定义列的类型,例如在本例中为
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)