PythonとHerokuを使ってLINEBOTを作成しているのですが、デプロイした後にオウム返しが帰ってこなくて困っています。


PythonとHerokuを用いてLINEBOTを作成しています。

<https://junpage.com/line-bot-development/>

ここの記事をもとに作成しているのですがデプロイしてもきちんとオウム返しされません。  
エラーを見ると以下の様に表示されました。

[code]

    2023-11-15T05:57:57.350610+00:00 app[web.1]: (to_user,) = cur.fetchone()
    2023-11-15T05:57:57.350649+00:00 app[web.1]: ^^^^^^^^^^
    2023-11-15T05:57:57.350658+00:00 app[web.1]: TypeError: cannot unpack non-iterable NoneType object
    
[/code]

コードを見ると以下の部分でcur.fetchone()がNoneだったときに(to_user,)の形で値を格納できないとのことなのですがどうすればcur.fetchone()がNoneだったときに(to_user,)の形で値を格納できますか？教えてください。

エラーを出してているのは以下のコードの部分です。

[code]

    def push():
        with get_connection() as conn:
            with conn.cursor() as cur:
                cur.execute('SELECT * FROM users ORDER BY random() LIMIT 1')
                (to_user,) = cur.fetchone()
        line_bot_api.multicast([to_user], TextSendMessage(text="今日もお疲れさん!!"))
    
[/code]

宜しくお願い致します。




今回起きているエラーは、 `cur.fetchone()` が `None` を返しているのが原因です。  
なので、 Falsy valueの場合に `return` することでエラーを解消することができます。

[code]

    def push():
        with get_connection() as conn:
            with conn.cursor() as cur:
                cur.execute('SELECT * FROM users ORDER BY random() LIMIT 1')
                random_users = cur.fetchone()  # 中間変数にセットする
                if not random_users: return    # もし空なら何もせず return する
                to_user = random_users.pop()   # random_users から最初の要素を取り出す
        line_bot_api.multicast([to_user], TextSendMessage(text="今日もお疲れさん!!"))
    
[/code]

