【问题标题】:how to find unique users with latest message from a message table in SQLAlchemy Python如何从 SQLAlchemy Python 中的消息表中找到具有最新消息的唯一用户
【发布时间】:2022-01-18 12:59:26
【问题描述】:

我有一个存储两个用户之间对话的消息表。表结构如下:

部分数据如下表:

所以我想编写一个函数,为我提供唯一用户的最后一条消息。比如上面的数据表,函数会返回下面的json。

[ {"mobile":"01675571522", "last_message":"为什么你不能给出正确的答案"}, {"mobile":"01773289045", "last_message":"Amr 01773289045 aii number a kikiBankasia account open kora ase"} ]

如何在 python 的 SQLAlchemy ORM 中做到这一点?

我的尝试:

我目前使用以下代码执行此操作:

users_set = set()
list_of_users = []
lst_msg_list = []
users = ChatResponseDB.read_all()
users_list = PreProcess.get_chat_history_list(users)

for item in users_list:
     chat_history = ChatResponseDB.read_response_by_user(item['mobile_number'])
     string_value = str(chat_history[-1])
     string_value = string_value[2:30] + '...'
     lst_msg_list.append(string_value)
     users_set.add(item['mobile_number'])

这种方法需要 10-12 秒。我怎样才能做得更好?

【问题讨论】:

    标签: python mysql sql sqlalchemy chatbot


    【解决方案1】:

    你可以使用普通的 sql 并像这样在 sqlalchemy 中执行它(我假设表名是chat_response):

    from sqlalchemy.sql import text
    
    stmt = """select 
       mobile_number, concat(substring(response, 1, 30), '...')
       from (    
          select 
          response,
          mobile_number,
          row_number() over (partition by mobile_number order by date_value desc) as row_no 
          from chat_response
       ) A
       where row_no = 1
    """
    serialized = []
    results = session.execute(text(stmt))
    for mobile_number, last_message in results:
        serialized.append({
            "mobile_number": mobile_number,
            "last_message": last_message
        })
    

    当然你可以将它改写成 sqlalchemy 语法,但它可能不会增加太多价值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 2018-07-23
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      相关资源
      最近更新 更多