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があった場合への対処は残っているが,ひとまず道筋はついたので投稿.