pythonで地震情報のWebサイトを作るために、Web APIをたたいてRDBにレコード登録する方法が知りたいです。
解決したいこと
pythonで地震情報のWebサイトを作るために、Web APIをたたいてRDBにレコード登録する方法が知りたいです。
あらかじめDBにテーブルを用意して、カラム名、データ型、を指定しています。
某AI chatに聞いてみましたが全然エラーが収まらず、解決方法を教えていただけないでしょうか。
発生している問題・エラー
データベースに接続しました。
データの挿入中にエラーが発生しました。ロールバックします。
エラー内容: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '茨城県北部', '3.6e0, '140.5e0, 36.5e0)' at line 1")
該当するソースコード
import requests
import json
import pymysql
import pandas as pd
def connect_database():
# データベースに接続する
connection = pymysql.connect(
host='ホスト名',
port=ポート名,
user='ユーザー名',
password='パスワード',
db='データベース名'
)
# 接続したか確認する
if connection:
print("データベースに接続しました。")
else:
print("データベースへの接続に失敗しました。")
exit()
return connection
def insert_eq_information(connection, data):
# カーソルを作成
cur = connection.cursor()
try:
# テーブルAにデータを挿入する
eq_information_data = [
{
"eq_id": item["id"],
"eq_data": item["earthquake"]["time"],
"name": item["earthquake"]["hypocenter"]["name"],
"magnitude": item["earthquake"]["hypocenter"]["magnitude"],
"longitude": item["earthquake"]["hypocenter"]["longitude"],
"latitude": item["earthquake"]["hypocenter"]["latitude"],
}
for item in data
if item["earthquake"]["hypocenter"]["magnitude"] != -1
]
for item in eq_information_data:
longitude = max(-180, min(180, item["longitude"])) # 範囲を -180 から 180 に制限
latitude = max(-90, min(90, item["latitude"])) # 範囲を -90 から 90 に制限
query = "INSERT INTO Test1 (eq_id, eq_data, name, magnitude, longitude, latitude) VALUES (%s, %s, %s, %s, %s, %s)"
values = (item["eq_id"], item["eq_data"], item["name"], item["magnitude"], longitude, latitude)
cur.execute(query, values)
# トランザクションのコミット
print("テーブルAへのデータ挿入が正常に完了しました。")
connection.commit()
except Exception as e:
# エラーが発生した場合の処理
print("テーブルAへのデータ挿入中にエラーが発生しました。ロールバックします。")
connection.rollback()
print("エラー内容:", str(e))
def insert_eq_intensity(connection, data):
# カーソルを作成
cur = connection.cursor()
try:
# テーブルBにデータを挿入する
eq_intensity_data = [
{
"eq_id": item["id"],
"pref": item["points"][0]["pref"],
"scale": item["points"][0]["scale"],
}
for item in data
] # ここでリスト内包表記を閉じる
for item in eq_intensity_data:
query = "INSERT INTO Test2 (eq_id, pref, scale) VALUES (%s, %s, %s)"
values = (item["eq_id"], item["pref"], item["scale"])
cur.execute(query, values)
# トランザクションのコミット
print("テーブルBへのデータ挿入が正常に完了しました。")
connection.commit()
except Exception as e:
# エラーが発生した場合の処理
print("テーブルBへのデータ挿入中にエラーが発生しました。ロールバックします。")
connection.rollback()
print("エラー内容:", str(e))
def main():
# APIエンドポイント
url = "https://api.p2pquake.net/v2/jma/quake"
# パラメータ
params = {
"limit": 100,
"offset": 0,
"order": -1
}
res = requests.get(url, params=params)
data = json.loads(res.text)
# データベースに接続する
connection = connect_database()
# テーブルAにデータを挿入する
insert_eq_information(connection, data)
# テーブルBにデータを挿入する
insert_eq_intensity(connection, data)
# データベース接続をクローズする
connection.close()
# メイン関数を実行
main()
自分で試したこと
●登録したカラムやデータ型を間違えて登録してると思い、何度か直そうと試みましたが、できませんでした。
●緯度(longitude)、経度(latitude)を登録する前に、2個のテーブル作成をDBの方で作るのではなくp、ythonで作成し、カラムを3つに絞ったときはうまく登録できました。