group_concat字符串被截断

时间:2019-03-12 13:42:42

标签: python mysql sqlalchemy flask-sqlalchemy

我有两个表,如下所示:

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.idgroup_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中做到这一点。如果有其他解决方案,那也可以。

0 个答案:

没有答案