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

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

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

2回答

1615閲覧

MySQLにデータが格納できない

jelyco3

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/07/26 08:41

編集2020/07/27 10:52

###、MySQLに格納したいと思っています。

発生している問題・エラーメッセージ

raise ProgrammingError(str(m))

MySQLdb._exceptions.ProgrammingError: not all arguments converted during bytes formatting

上記のように表示され、抽出結果をMySQLに格納できません。
データをMySQLに格納するためにはどうすればよろしでしょうか

該当のソースコード

Python

1 2 3 4 5def main(): 6 CK = '*****************************************' 7 CKS = '*****************************************' 8 AT = '*****************************************' 9 ATS = '*****************************************' 10 11 #接続 12 conn = MySQLdb.connect(host='localhost',user='root',passwd='abcdefg',db='aaa',') 13 c = conn.cursor() 14 15 c.execute("INSERT INTO tweet(user_id,content) VALUES(%s,%s)") 16 cursor.close() 17 conn.commit() 18 19 20 21 main()

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

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

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

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

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

quickquip

2020/07/26 10:26

main関数の前半が欠けていませんか?
jelyco3

2020/07/26 11:14

申し訳ございません。 前半部分の欠けていた箇所につきまして追記致しました。
guest

回答2

0

⑴は解消されましたが、⑵についてご教授頂けますでしょうか。

テーブルはコード上のみで作成していますが、別では作成してないです。

スマホからなので、とりあえず気になった点を列挙しますので、このあたりを確認してみてください。

1.質問のソースコード

def search_tweets(CK, CKS, AT, ATS, user_id, tweet_id, count, range):
(略)
return tweets
#ユーザ名,ツイートの内容をMysqlに入れていく
c.execute('INSERT INTO tweet(user_id,content) VALUES(%s,%s)',(tweet['user_id'],content['content']))
(略)

では、MySQL にインサートする前に return しているようにみえるのですが... ( この位置では、c.execute が実行されていないのでは? )

2.search_tweets の c.execute ですが、 c が定義されていないので、 'c' is not defined あたりのエラーが出るのではないでしょうか?

3.MySQLdb.connect の箇所もおかしい気がします。

投稿2020/07/27 04:11

CHERRY

総合スコア25218

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

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

jelyco3

2020/07/27 05:00

1につきまして、順番を入れ替え修正しました。 修正後のコードを記載いたします。 2,3につきましておっしゃる通り'c' is not definedとなりました。 ですので、MySQLdb.connectの位置につきましても修正しましたところ、下記のエラーとなりました。 キーエラーは何処が不備がありますでしょうか。 検索回数 : 101 リプライ数 : 0 Traceback (most recent call last): File "script.py", line 87, in <module> main() File "script.py", line 21, in main tweets = search_tweets(CK, CKS, AT, ATS, user_id, count, range) File "script.py", line 79, in search_tweets c.execute('INSERT INTO tweet(user_id,content) VALUES(%s,%s)',(tweet['user_id'],content['content'])) KeyError: 'user_id'
CHERRY

2020/07/27 06:11 編集

とりあえず、エラー部分だけコメント > KeyError: 'user_id' のエラーメッセージは、メッセージの通りでキーがないからですね。 お使いの Twitter API は、[Standard search API]( https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets ) と思いますが、上記ドキュメントからレスポンス部分を引用すると 投稿者周りは、 > (前半略) > "user": { > "id": 2244994945, > "id_str": "2244994945", > "name": "Twitter Dev", > "screen_name": "TwitterDev", > "location": "Internet", > "description": "Your official source for Twitter Platform news, updates & events. Need technical help? Visit https://t.co/mGHnxZU8c1 ⌨️ #TapIntoTwitter", > (以下略) となっており、API のレスポンスに 'user_id' という項目は存在しません。そのためキーが無い状態で、エラーになります。 上記のレスポンスが入っている変数 tweet の投稿者を参照するということであれば、tweet["user"]["id"] や tweet["user"]["screen_name"] になると思います。(複数あるのであれば、ループ内で処理しなくては駄目では?) また、2回めの `requests.get(〜)` で、取得したレスポンスを使っていないようですがこれはまだ制作途中ということでしょうか?
jelyco3

2020/07/27 06:58

ありがとうございます! 1につきまして screen_nameとしましたら抽出することができました。 2つめのrequests.get(〜)につきまして、正直必要性もわかっていないためもしかしたら必要ないかもしれないです。。。。。 ただ4000件ほどリプライを抽出することができました。 あとはMySQLに格納したいのですが、下記についてどこを修正すればよろしいでしょうか c.execute('INSERT INTO tweet(screen_name,content) VALUES(%s,%s)',(tweet['screen_name'],content['content'])) conn.commit() return tweets
guest

0

user_idの後ろにデータ型が必要じゃないですか?
BIGINT型ですかね。

plain

1 CREATE TABLE tweet( 2 user_id bigint, 3 content text 4 )

投稿2020/07/26 23:27

quickquip

総合スコア11235

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

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

jelyco3

2020/07/27 01:19

ありがとうございます。 MySQLにはDBとテーブルが作成されましたが中身を見てみると空でした。 特定の人物のツイートに対しての返信を抽出するロジックが不備がありますでしょうか?
quickquip

2020/07/27 01:45 編集

不備は確かにありますが、質問は「下記のエラーが表示されております。SQLの文法エラーと見受けられるのですが、どこの部分を訂正すればいいかわからない状況です。」だったのでその点について回答しました。 データが保存されないことはコードから想像が付きますが、そこは質問されていませんから「わざと保存しないようにした」コードを貼り付けていると判断していました。
quickquip

2020/07/27 01:45 編集

テーブルは別のなにかで作成済みなのでしょうか? そして本当の質問は「エラーメッセージがわからない」ではなくて「データが保存されていないのはなぜか?」なのでしょうか? だとしたら質問を修正してほしいです。
jelyco3

2020/07/27 02:03

申し訳ございません。 質問は2点ございました。 ⑴エラーメッセージの解消について ⑵DBにデータが格納されない件について ⑴は解消されましたが、⑵についてご教授頂けますでしょうか。 テーブルはコード上のみで作成していますが、別では作成してないです。
jelyco3

2020/07/27 02:24

コードを修正しました。 user_idに一致するリプライを抽出、またdb、テーブルは作成済なのでコメントアウトしております
quickquip

2020/07/27 11:16

結局、user_id は何型なんですか? (=何を格納するつもりなんですか?) screen_nameを格納するつもりだったなら文字列だと仮定して、単純に c.execute('INSERT INTO tweet(user_id,content) VALUES(%s,%s)',('A', 'B')) などは成功するのでしょうか?
quickquip

2020/07/27 11:20

c.execute("INSERT INTO tweet(user_id,content) VALUES(%s,%s)") はargsが指定されていないので必ず失敗しますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問