【问题标题】:How to get cursor.execute() results as String (not tuple)?如何将 cursor.execute() 结果作为字符串(不是元组)?
【发布时间】:2021-07-23 08:24:36
【问题描述】:

我正在尝试实现一个(简单的)论坛风格的网络应用程序。我目前正在尝试在网页上显示我的数据库中的线程标题(“主题”)。我正在使用 mysql 连接器游标与数据库进行交互,并且在返回结果时我想以纯字符串格式而不是 cursor.fetchall() 返回的元组显示它们,但我找不到这样做的方法光标。有谁知道在不改变我与数据库交互方式的情况下做到这一点的方法吗?

这是我获取主题标题并将它们传递到我渲染它们的模板的代码:

 cursor.execute('SELECT title FROM topics;')
    topics = cursor.fetchall()
    return render_template('forumIndex.html', topics=topics)

这是模板中的 jinja 代码,用于将主题标题呈现到页面上的无序列表中:

{% for topic in topics %}
<ul class="topic-list" id="topics">
    <li class="topic-list-item">{{ topic }}</li>
</ul>
{% endfor %}

标题以元组形式输出到页面上,如下:

('测试',)

('这是一个主题标题',)

('一个惊人的标题!',)

我认为无论我读了多少关于光标的内容,我都不太了解光标的工作原理。如果有人能够解释我哪里出错了,甚至只是指出我不理解的地方,将不胜感激。

谢谢。

【问题讨论】:

    标签: python mysql flask web-applications


    【解决方案1】:

    这应该也可以:

    {% for topic in topics %}
    <ul class="topic-list" id="topics">
        <li class="topic-list-item">{{ topic[0] }}</li>
    </ul>
    {% endfor %}
    

    【讨论】:

    • 我认为这正是斯蒂芬在他的评论中提到的,谢谢你的例子,非常感谢! (我还没有代表来投票,但我已将反馈发送到堆栈)。
    【解决方案2】:

    MySql 连接器符合 PEP249 中指定的 Python DBAPI。因此,fetchall 方法需要返回一个“序列序列”,这意味着您必须从该方法接收一个元组列表。您可以做的是操纵该序列以根据需要显示它。有多种方法可以解决,但一种简单的方法是修改返回 topics 变量的方式:

    return render_template('forumIndex.html', topics=[topic[0] for topic in topics]) # go from [('item',), ...] to ['item', ...]
    

    如果您有大量主题,您可能会通过在渲染模板中更改它来提高效率,这样您就不会重复数据两次。

    【讨论】:

    • 太棒了,谢谢。我也很欣赏关于效率的提示!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2018-07-21
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多