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

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

新規登録して質問してみよう
ただいま回答率
85.47%
さくらのレンタルサーバ

さくらのレンタルサーバとは、格安サーバーで知られるさくらインターネット社の提供する共有レンタルサーバー。Webサイトの構築から簡単なプログラミングまで幅広く利用することができ、プランが多いことも特徴です。

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

Python 3.x

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

FreeBSD

FreeBSDは、Unix系のオープンソースのOSです。PC/AT互換機用ですが、他のプラットフォームにも移植されています。優れたネットワーク・セキュリティ・ストレージ機能で人気のOSです。ソースコードと共に無償で公開されており、多くの コミュニティによって長年に渡って開発されています。

Q&A

解決済

1回答

1096閲覧

さくらサーバでPythonでMySQLにINSERTしても値が入りません

hanzama

総合スコア28

さくらのレンタルサーバ

さくらのレンタルサーバとは、格安サーバーで知られるさくらインターネット社の提供する共有レンタルサーバー。Webサイトの構築から簡単なプログラミングまで幅広く利用することができ、プランが多いことも特徴です。

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

Python 3.x

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

FreeBSD

FreeBSDは、Unix系のオープンソースのOSです。PC/AT互換機用ですが、他のプラットフォームにも移植されています。優れたネットワーク・セキュリティ・ストレージ機能で人気のOSです。ソースコードと共に無償で公開されており、多くの コミュニティによって長年に渡って開発されています。

0グッド

1クリップ

投稿2022/04/17 04:57

さくらレンタルサーバを(スタンダード)使用しています。
(FreeBSD 9.1-RELEASE-p24)
(Python 3.8.9)

pipインストールリスト

beautifulsoup4 4.10.0
certifi 2021.10.8
chardet 4.0.0
charset-normalizer 2.0.12
cssselect 1.1.0
idna 3.3
lxml 4.8.0
mysqlclient 2.1.0
pip 22.0.4
requests 2.27.1
setuptools 49.2.1
soupsieve 2.3.1
urllib3 1.26.9
wheel 0.37.1

以下のコードで、print表示した場合変数の値(ランキングやクラブネーム)は表示されているのですが、
MySQLにINSERTした場合、値が0として入力されます。
お詳しい型ご教授いただけますと幸いです。

MySQLdb モジュールでデータベースに接続する

conn = MySQLdb.connect(host='データベースサーバ', db='データベース名',user='ユーザー名',passwd='パスワード',charset='utf8mb4')

カーソル作成

cur = conn.cursor()

url = "https://www.jleague.jp/standings/j1/"
f = urllib.request.urlopen(url)
soup = BeautifulSoup(f, "html.parser")

テーブル(表)要素の全取得

table = soup.find_all('table', class_='scoreTable01')

全クラブネームの取得

all_Club_Name = soup.find_all('td', class_='tdTeam')

Ranking = 1

for tmp in all_Club_Name:

# 現在の日付 d = datetime.date.today() # ランキング Ranking = Ranking + 1 # クラブネーム1要素ずつ出力#get_text()で文字データを取得する。 s = tmp.get_text() # 文字数の半分の数を計算 half = len(tmp.get_text()) // 2 # 前半半分を抽出 Club_Name = s[:half] # 次の要素(勝点) Win_Points = tmp.next_sibling.next_sibling query = 'insert into j1jyunni value (Ranking,Club_Name,Win_Points,0,0,0,0,0,0,0)' cur.execute(query)

print(Ranking)

conn.commit()

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

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

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

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

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

68user

2022/04/17 10:05

print(query) すれば、狙い通りの SQL になっていないことがわかるのではないかと思いますが、しかしこれ実行時に SQL エラーとならないんですかね?
hanzama

2022/04/18 13:10

68user様、ご回答ありがとうございます。 query = 'insert into j1jyunni value (Ranking,Club_Name,Win_Points,0,0,0,0,0,0,0)' cur.execute(query) の部分を以下のように変更して print(Ranking) query = 'insert into j1jyunni value (Ranking,Club_Name,Win_Points,0,0,0,0,0,0,0)' print(query) cur.execute(query) 実行いたしますと、以下のような結果となります。 Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER. 1 insert into j1jyunni value (Ranking,Club_Name,Win_Points,0,0,0,0,0,0,0) 2 insert into j1jyunni value (Ranking,Club_Name,Win_Points,0,0,0,0,0,0,0) 3 insert into j1jyunni value (Ranking,Club_Name,Win_Points,0,0,0,0,0,0,0) ・ ・ ・ 以下のように、Rankingの部分が数字となりません。 Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER. 1 insert into j1jyunni value (1,Club_Name,Win_Points,0,0,0,0,0,0,0) 2 insert into j1jyunni value (2,Club_Name,Win_Points,0,0,0,0,0,0,0) 3 insert into j1jyunni value (3,Club_Name,Win_Points,0,0,0,0,0,0,0) ・ ・ ・ <参考にしたサイト> https://atmarkit.itmedia.co.jp/ait/articles/1910/18/news015_2.html
68user

2022/04/18 18:39

実行すべきSQLは insert into j1jyunni value (Ranking,Club_Name,Win_Points,0,0,0,0,0,0,0) ではなく insert into j1jyunni values (1,'xxxx',10,0,0,0,0,0,0,0) などであるはずです。なので、 query = "INSERT INTO xxx values ({},'{}',{},0,0,0,0,0,0,0)".format(Ranking,Club_Name,Win_Points) こんな感じになります。 ただし SQL を文字列で作ると変数部分にシングルクォートがあったりすると危険なので (SQL インジェクション)、よりよいやり方はプレースホルダを使う方法です。 参考: https://www.craneto.co.jp/archives/1219/ で、そもそも誤った SQL を実行してもエラーとならないのはおかしいわけですが、mysqldb は普通に例外投げてくると思うんですが何でですかね。
guest

回答1

0

自己解決

68user様お世話になります。
以下の方法で、実現できました。
色々とご教授いただき、誠にありがとうございましたm(__)m

j1jyunni_sql.py

import datetime
import urllib.request
from bs4 import BeautifulSoup
import MySQLdb

MySQLdb モジュールでデータベースに接続する

connection = MySQLdb.connect(host='データベースサーバ', db='データベース名',user='ユーザー名',passwd='パスワード',charset='utf8mb4')

カーソル作成

cursor = connection.cursor()

url = "https://www.jleague.jp/standings/j1/"
f = urllib.request.urlopen(url)
soup = BeautifulSoup(f, "html.parser")

テーブル(表)要素の全取得

table = soup.find_all('table', class_='scoreTable01')

全クラブネームの取得

all_Club_Name = soup.find_all('td', class_='tdTeam')

現在の日付

d = datetime.date.today()

エラー処理(例外処理)

try:
# CREATE
# id, name だけのシンプルなテーブルを作成。id を主キーに設定。
cursor.execute("DROP TABLE IF EXISTS sample")
cursor.execute("""CREATE TABLE IF NOT EXISTS sample (
id int(11) NOT NULL,
name varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci""")

print(d) Ranking = 0 for tmp in all_Club_Name: # ランキング #print(Ranking) Ranking = Ranking + 1 # クラブネーム1要素ずつ出力#get_text()で文字データを取得する。 s = tmp.get_text() # 文字数の半分の数を計算 half = len(tmp.get_text()) // 2 # 前半半分を抽出 Club_Name = s[:half] # 次の要素(勝点)タグを除いた部分を取得 Win_Points = tmp.next_sibling.next_sibling.text print(Win_Points) # プレースホルダの使用例 # 複数レコードを一度に挿入 executemany メソッドを使用 persons = [ (Ranking, Club_Name, Win_Points,0,0,0,0,0,0,0), ] cursor.executemany("INSERT INTO j1jyunni VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", persons) #print(persons) # わざと主キー重複エラーを起こして例外を発生させてみる

cursor.execute("INSERT INTO sample VALUES (1, '中村')")

except MySQLdb.Error as e:
print('MySQLdb.Error: ', e)

保存を実行(忘れると保存されないので注意)

connection.commit()

投稿2022/04/29 01:01

hanzama

総合スコア28

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問