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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

API

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

Q&A

解決済

1回答

531閲覧

json形式のデータをfor分を使ってsqliteに登録

yororodesu

総合スコア1

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

API

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

0グッド

0クリップ

投稿2023/06/04 02:54

実現したいこと

json形式のデータをfor分を使ってsqliteに登録をpythonを使用して実現したい

前提

ServiceNowというSaaS(PaaS)に存在するデータをAPIで取得(JSON形式でレスポンス)し、
JSON形式で取得したデータをsqliteに登録したいが、vscodeでエラーが出てしまう。
エラーが発生せずに実行したい。

APIで取得できるJSONでの以下データの"P1000165"、"lnux100"、"2022-03-28 08:00:00"を
sqliteに登録したいです。

{
"result": [
{
"asset_tag": "P1000165",
"name": "lnux100",
"install_date": "2022-03-28 08:00:00"
}
]
}

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

変数dataは定義しているはずですが、以下がエラーメッセージが出力されます。

for item in data["result"]:
^^^^
NameError: name 'data' is not defined

該当のソースコード

#Need to install requests package for python
#easy_install requests
import requests
import sqlite3

Set the request parameters

url = 'url = 'https://devxxxxxxx.service-now.com/api/now/table/cmdb_ci_linux_server?sysparm_query=nameSTARTSWITHlnux100&sysparm_fields=name%2Cinstall_date%2Casset_tag&sysparm_limit=1'
'

Eg. User name="admin", Password="admin" for this code sample.

user = 'xxxxx'
pwd = 'xxxxx'

Set proper headers

headers = {"Content-Type":"application/json","Accept":"application/json"}

Do the HTTP request

response = requests.get(url, auth=(user, pwd), headers=headers )

Check for HTTP codes other than 200

if response.status_code != 200:

Decode the JSON response into a dictionary and use the data

data = response.json()

conn = sqlite3.connect("/Users/xxxx/Desktop/xxxxx.db")

cursor = conn.cursor()

for item in data["result"]:
field1 = item["asset_tag"] # テーブルのレコードからの値を取得
field2 = item["name"] # テーブルのレコードから値を取得
field3 = item["install_date"] # テーブルのレコードから値を取得
conn.execute("INSERT INTO linux_table VALUES (field1, field2, field3)")

conn.commit()

conn.close()

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

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

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

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

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

guest

回答1

0

ベストアンサー

原因:元のコードだと、ステータスコードが200以外のときにdata=response.json()の行が実行されるようになっている。よってステータスコードが200だとdataは定義されたことにならない。
なので、ステータスコードで分岐するところを外してみたのが下のコード。
以下のコードに直して保存し、実行したときに、正常に動くか試してください。(当然ですがurlやユーザIdやパスワードは実際のものに直してください)
エラーが出てうまく動かない場合は、出たエラーを全部書いてください。

import requests import sqlite3 url = 'https://devxxxxxxx.service-now.com/api/now/table/cmdb_ci_linux_server?sysparm_query=nameSTARTSWITHlnux100&sysparm_fields=name%2Cinstall_date%2Casset_tag&sysparm_limit=1' user = 'xxxxx' pwd = 'xxxxx' headers = {"Content-Type":"application/json","Accept":"application/json"} response = requests.get(url, auth=(user, pwd), headers=headers ) print("ステータスコード="+str(response.status_code)) data = response.json() conn = sqlite3.connect("/Users/xxxx/Desktop/xxxxx.db") cursor = conn.cursor() for item in data["result"]: field1 = item["asset_tag"] # テーブルのレコードからの値を取得 field2 = item["name"] # テーブルのレコードから値を取得 field3 = item["install_date"] # テーブルのレコードから値を取得 conn.execute("INSERT INTO linux_table VALUES (field1, field2, field3)") conn.commit() conn.close()

投稿2023/06/04 04:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yororodesu

2023/06/04 05:53

ありがとうございます。解決いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問