0
0

More than 3 years have passed since last update.

MySQLのjson_dataを使ってはまったこと

Posted at

twitter API v2でツイートを収集して,MySQLに格納しようとしてはまったのでメモする.

環境

WSL2(Ubuntu 20.04.2 LTS)+Python 3.7.9+MySQL 8.0を使っている.
PythonからのMySQLへのアクセスには,mysql.connectorを使っている.

やろうとしたこと

よく使う属性の値はvarcharやintで宣言したカラムに格納し,一応APIの返却した各ツイートの情報全体をjson_dataに格納することにしたが,insertに失敗する.

alldata = requests.get(endpoint, params=params, headers=headers)
obj = json.loads(alldata.text) # dictに変換
data = obj['data']

cur.execute(insert_tweet_sql, (中略, data))

エラーメッセージ

mysql.connector.errors.InterfaceError: Python type dict cannot be converted

dictをstr()で文字列に変換して突っ込んだら,またエラーが出た.

cur.execute(insert_tweet_sql, (中略, str(data)))

エラーメッセージ

mysql.connector.errors.InterfaceError: Error while executing statement: Invalid JSON text: "Missing a name for object member." at position 1 in value for column 'テーブル名.カラム名'.

dataはこんな感じ.

{'referenced_tweets': [{'type': 'replied_to', 'id': (後略)

試してみると,引用符が'ではダメで"なら通ったのでsingle quoteをdouble quoteに文字列置換

cur.execute(insert_tweet_sql, (中略, str(data).replace("'", '"'))

またエラーが出た.

mysql.connector.errors.InterfaceError: Error while executing statement: Invalid JSON text: "Invalid value." at position 216 in value for column 'テーブル名.カラム名'.

JSONの216字目を見たら,'possibly_sensitive': Falseがあった.Falseを"False"に置換したら,無事レコードが追加できた.

本文中にシングルクォートや,TrueとかFalseがあった場合への対処は残っているが,ひとまず道筋はついたので投稿.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0