我有两个表,如下所示:
class Workflows():
__tablename__ = 'workflows'
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.Unicode(255),unique=True)
class Tasks():
__tablename__ = 'tasks'
id = db.Column(db.Integer(), primary_key=True)
workflow_id = db.Column(db.Integer(), db.ForeignKey('workflows.id', ondelete='CASCADE'))
name = db.Column(db.Unicode(255), server_default=u'')
modified_at = db.Column(db.DateTime(),default=datetime.datetime.utcnow)
我使用sqlalchemy ORM编写了一个简单的查询,如下所示:
(
db.session.query(
Workflows.id,
(
'[' +
func.group_concat(
'{"name": "', Tasks.name, '", "modified_date": "', Tasks.modified_at, '"}'
)
+ ']'
).label('task_name')
)
.filter(Workflows.id == Tasks.workflow_id)
.group_by(Workflows.id)
.all()
)
当我执行上述查询时,我得到了预期的输出,它是一对Workflows.id
和group_concat(dict)
。输出示例为:
[
{'id': 30, 'task_name': '[{'name': 'Task 1', 'modified_date': '2019-03-07 12:59:51'}, {'name': 'Task 2', 'modified_date': '2019-03-07 12:59:51'}, {'name': 'Task 3', 'modified_date': '2019-03-07 12:59:51'}]'},
{'id': 31, 'task_name': '[{'name': 'Task A', 'modified_date': '2019-03-07 13:01:58'}, {'name': 'Task B', 'modified_date': '2019-03-07 13:01:58'}, {'name': 'Task C', 'modified_date': '2019-03-07 13:01:58'}]'}
]
当我将上述查询用作子查询时,会出现问题。当我更改上述查询并将其用作另一个查询的别名时,task_name
被截断。例如,如果我运行以下查询:
workflow_data = (
db.session.query(
Workflows.id,
(
'[' +
func.group_concat(
'{"name": "', Tasks.name, '", "modified_date": "', Tasks.modified_at, '"}'
)
+ ']'
).label('task_name')
)
.filter(Workflows.id == Tasks.workflow_id)
.group_by(Workflows.id)
.subquery()
)
sub_data = (
db.session.query(
workflow_data
)
.all()
)
在这里打印sub_data
时,得到以下输出:
[
{'id': 30, 'task_name': '[{'name': 'Task 1', 'modified_date': '2019-03-07 12:59:51'}, {'name': 'Tas
{'id': 31, 'task_name': '[{'name': 'Task A', 'modified_date': '2019-03-07 13:01:58'}, {'name': 'Tas
]
输出中的 task_name
在特定长度上被截断。我相信我需要像这样的this帖子来增加GROUP_CONCAT的长度限制。但是我不知道如何在sqlalchemy中做到这一点。如果有其他解决方案,那也可以。