【问题标题】:Python/MySQL: Select data in a for loopPython/MySQL:在 for 循环中选择数据
【发布时间】:2015-06-15 13:58:06
【问题描述】:

如果我无法用语言表达我的问题,我深表歉意。基本上,我正在编写一个消息传递系统,用户可以在其中向其他用户发送消息并在收件箱中查看他们的消息。以下是我的数据库和 GUI 的一些截图: http://imgur.com/a/ra5Di

这是我在收件箱中显示消息的功能:

#DISPLAY MESSAGE IN INBOX FUNCTION
def displayMessageInbox(mf, c, vm):
    recipient = config.nameInput

    cursor.execute("""SELECT CONCAT('Title: ', m.title, '\n',
                    'From: ', s.sender, '\n',
                    'Sent: ', s.timeSent)
                    FROM Message m
                    INNER JOIN SentMessage s ON m.id = s.messageID
                    WHERE s.recipient = %s""", (recipient))
    rows = cursor.fetchall()

    i = 3
    for message in rows:
        messageInfo = tk.Label(mf, text=message, bg="white", anchor=tk.W,
                               justify=tk.LEFT, width=30)
        messageInfo.grid(row=i, column=0, sticky=tk.W)
        viewReply = tk.Button(mf, text="View/Reply", anchor=tk.W,
                      command=lambda:c.show_frame(vm))
        viewReply.grid(row=i, column=1,padx=10, sticky=tk.W)
        i+=1

这是我在用户点击“查看/回复”后显示消息及其内容的功能。请注意,它选择的是一个特定的消息 ID,而不是我真正希望它显示的那个。换句话说,它只是占位符。

#READ MESSAGE CONTENT FUNCTION
def readMessage(mf):
    mID = 'a6bb9c97-0f59-44ea-9f2b-759ffbac5031'

    cursor.execute("""SELECT CONCAT('From: ', sm.sender, '\n',
                'Title: ', m.title, '\n',
                'Message: ', m.content)
                FROM Message m
                INNER JOIN SentMessage sm ON m.id = sm.messageID
                WHERE m.id = %s""", (mID))
    rows = cursor.fetchone()

    message = rows[0]
    readMessageLabel = tk.Label(mf, text=message, bg="white", anchor=tk.W,
                                justify=tk.LEFT, width=100)
    readMessageLabel.grid(row=3, column=0, padx=10, sticky=tk.W)

所以我的问题是......我希望用户能够点击“查看/回复”并查看相应的消息,而不仅仅是占位符。我什至不知道如何开始解决这个问题。我认为我想要做的是从 displayMessageInfo 的 for 循环中的特定行获取消息 id,但我不完全确定。有什么想法吗?

【问题讨论】:

  • 为什么要在 SQL 中完成格式化?您应该(IMO)查询您的数据库以获取所有相关信息,在第一个函数的情况下是消息 ID、标题、发件人、timeSent。你的 python/whatever 应该处理格式和显示。然后,您将获得可以传递给 readMessage 函数的消息 ID——我认为它应该遵循相同的格式规则。

标签: python mysql database tkinter mysql-python


【解决方案1】:

显然,mID 是一个静态值。您需要通过在用户按下“查看/回复”后将其值传递给 readMessage 函数以相应消息的条件来使该变量动态化。

虽然我不知道您的应用程序界面控件的设置,但请考虑:1) 查询消息 ID,2) 将其保存到变量中,3) 将其传递给函数。也许这可以让你开始:

def displayMessageInbox(mf, c, vm):
    recipient = config.nameInput

    cursor.execute("""SELECT m.id, CONCAT('Title: ', m.title, '\n',
                    'From: ', s.sender, '\n',
                    'Sent: ', s.timeSent) As messagetxt
                    FROM Message m
                    INNER JOIN SentMessage s ON m.id = s.messageID
                    WHERE s.recipient = %s""", (recipient))

    i = 3
    for message in cursor.fetchall():
          mID = message[0]
          messagetxt = message[1]
          ...

          if (viewReply == somevalue): # ENTER LOGIC TO CAPTURE WHICH MESSAGE USER SELECTED     
                 readMessage(mf, mID)

def readMessage(mf, mID):

    cursor.execute("""SELECT CONCAT('From: ', sm.sender, '\n',
            'Title: ', m.title, '\n',
            'Message: ', m.content)
            FROM Message m
            INNER JOIN SentMessage sm ON m.id = sm.messageID
            WHERE m.id = %s""", (mID))
    rows = cursor.fetchone()

    message = rows[0]
    ...

【讨论】:

  • mID = message[0] 不仅返回 id,它还返回标题、发送者和 timeSent。是否有其他方法可以仅检索 id?
  • 见上面的变化。这将遍历选择查询的所有 mID 和消息。但是,您需要添加一些逻辑以仅调用与用户的 viewReply 选择对应的 readMessage 函数。您可以将消息 ID 绑定到 viewReply 按钮的值吗?。
  • 谢谢。这么晚才回复很抱歉。到目前为止,viewReply 按钮所做的唯一事情就是将用户引导到不同的页面(这是 GUI 模块中的一个“ViewMessage”类)。 readMessage 是在 ViewMessage 类中调用的函数。我会试着弄清楚事情,让你知道事情的进展。
  • 嗨,我只是想更新一下我的情况。我将您的解决方案与此解决方案结合使用,并且有效! stackoverflow.com/questions/17677649/…
猜你喜欢
  • 1970-01-01
  • 2022-06-22
  • 2020-02-02
  • 2017-06-17
  • 2013-06-02
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多