質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1098閲覧

LINEbotを初めて作っているのですが、フォローイベントの際にその人のスキーマをPostgreSQLで作る方法が分かりません。

kento15

総合スコア0

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/07/11 04:54

編集2021/07/11 05:15

前提・実現したいこと

初めてLINEbotをPython,Herokuを用いて作っているのですが、フォローイベントの際にその人のユーザーID名のスキーマをPostgreSQlで作成する方法が分かりません。

該当のソースコード

Python

1from flask import Flask,request,abort 2from linebot import LineBotApi,WebhookHandler 3from linebot.exceptions import InvalidSignatureError 4from linebot.models import MessageEvent,TextMessage,TextSendMessage,FollowEvent 5import os 6import psycopg2 7 8app=Flask(__name__) 9 10#環境変数の取得 11YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"] 12YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"] 13line_bot_api=LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN) 14handler=WebhookHandler(YOUR_CHANNEL_SECRET) 15 16@app.route("/callback",methods=["POST"]) 17def callback(): 18 signature=request.headers["X-Line-Signature"] 19 body=request.get_data(as_text=True) 20 app.logger.info("Request body"+body) 21 try: 22 handler.handle(body,signature) 23 except InvalidSignatureError: 24 abort(400) 25 return "OK" 26 27@handler.add(FollowEvent) 28def handle_follow(event): 29 your_id = event.source.user_id 30  message = "君のユーザーIDは{}だよ".format(your_id) 31 line_bot_api.reply_message(event.reply_token,TextSendMessage(text=message)) 32 #まだその人のスキーマが作成されていなければ新規作成する。 33 with psycopg2.connect("dbname=linebot user=postgres password=pass") as conn: 34 with conn.cursor() as cur: 35 cur.execute("CREATE SCHEMA IF NOT EXISTS {}".format(your_id)) 36 37if __name__=="__main__": 38 port=int(os.getenv("PORT",5000)) 39 app.run(host="0.0.0.0",port=port)

試したこと

スキーマの作成だけでなくデータベースからのデータ取得などもできるか確認しましたができませんでした。
しかし「君のユーザーIDは○○だよ」というメッセージは届くので、Bot自体は動いていると思います。
また、with文のところのみを別に実行してみたところ、無事にスキーマを作成することが出来ました。
なのでAPIの使いかたを間違えているのかと思いましたが、リファレンスを読んでも原因を見つけることができませんでした。(もしかすると見落としてしまっているのかもしれません...。)
何か分かる方がいらっしゃれば、よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

同階層のファイルです。

Procfile

web: python main.py

requirements.txt

Flask==0.12 line-bot-sdk==1.8.0 psycopg2==2.8.6

runtime.txt

python-3.9.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2021/07/20 03:40 編集

質問に直接関係ありませんけど、postgresのロールでスキーマを分けて、独立させるという事ならまだしも、利用者のユーザー毎のスキーマを作る事にあまりメリットを感じませんが何故そうするのでしょう? 多分同一構造のテーブルをユーザー毎に持たせたいというような事だと思いますけど、ユーザー同士の繋がりを求めるような場合には、SQLレベルではデメリットしか無いと思うのですが。
kento15

2021/07/21 06:26

ありがとうございます。 今回初めてデータベースを触ってみたので、上手な設計などを理解できていません。saziさんがおっしゃるように、ユーザーごとに同一構造のテーブルを作りたいのですが、どのような構成にするのがよいのでしょうか?教えてくださると助かります。
sazi

2021/07/21 07:06 編集

> ユーザーごとに同一構造のテーブルを作りたい ユーザー毎に独立したサービスなら別ですが、そうでないなら止めておいた方が良いです。 テーブルにユーザーIDをキーとして追加したテーブル構造にしておいた方が良いでしょう。
kento15

2021/07/23 07:59

なるほどです。確かにスキーマで分けてしまうと不便ですね...。 アドバイスありがとうございます。
guest

回答2

0

自己解決

Herkou PostgreSQLのDBに接続していたのではなく、自分で勝手に作ったDBに接続しようとしていたので動かなかったようです。

投稿2021/09/18 07:30

kento15

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

handle_follow()関数に、下記のデコレータ(handler.add~)を付ける必要があると思います。

@handler.add(FollowEvent) def handle_follow(event): your_id = event.source.user_id   message = "君のユーザーIDは{}だよ".format(your_id) (以下略)

投稿2021/07/11 05:10

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kento15

2021/07/11 05:17

ご指摘ありがとうございます。もともともコードにはデコレータも書いていたのですが、コピペし忘れていたようです。おかげで気づくことが出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問