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

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

ただいまの
回答率

90.32%

  • Python

    9225questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • MySQL

    6188questions

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

  • SQL

    2557questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

SQL syntax

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 169

RenNearco

score 1

 実現したいこと

pythonでMySQLへデータを挿入したいのです。

 前提

  1. コネクターはMySQL Connectorです。
  2. 辞書profileに入っているデータは下記の通りです。
{'登録': '繁殖', '品種': 'サラ', '性別': '牡', '生年月日': '2002/03/2516歳', '馬主': '金子真人ホールディングス(株)', '毛色': '鹿毛', '調教師': '池江泰郎(栗東)
', '生産牧場': 'ノーザンファーム', '産地': '早来産', '戦績': '国内:13戦12勝海外:1戦0勝', '総賞金': '145455.1万円', '市場取引': '2002年7350.0万円セレクトセールサ
ラブレッド当歳', '繋養先': '社台スタリオンステーション 勇払郡安平町電話:0145-22-4581', '種付料': '2018年度:プライベート'}

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

Traceback (most recent call last):
  File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/mysql/connector/connection_cext.py", line 377, in c
md_query
    raw_as_string=raw_as_string)
_mysql_connector.MySQLInterfaceError: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to
 use near 'values (742976, ディープインパクト, Deep Impact, JPN, 繁殖, サラ, ' at line 1

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "horse_q.py", line 76, in <module>
    profile['市場取引'], profile['繋養先'], profile['種付料']))
  File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/mysql/connector/cursor_cext.py", line 264, in execu
te
    raw_as_string=self._raw_as_string)
  File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/mysql/connector/connection_cext.py", line 380, in c
md_query
    sqlstate=exc.sqlstate)
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for th
e right syntax to use near 'values (742976, ディープインパクト, Deep Impact, JPN, 繁殖, サラ, ' at line 1

 該当のソースコード

cursor.execute('insert into horse \
                (id, name_ja, name_en, country, \
                 state, kind, sex, date_of_birth, owner, coat_color, \
                 trainer, breeding_farm, producting_area, past_performance, earning, \
                 market, maintin_farm, stud_fee \
                values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)' %
                (start, name_ja, name_en, country,
                 profile['登録'], profile['品種'], profile['性別'],
                 profile['生年月日'], profile['馬主'], profile['毛色'],
                 profile['調教師'], profile['生産牧場'], profile['産地'],
                 profile['戦績'], profile['総賞金'],
                 profile['市場取引'], profile['繋養先'], profile['種付料']))

 ソースコード全文

import mysql.connector
import urllib.request, urllib.error
from bs4 import BeautifulSoup
import re

connect = mysql.connector.connect(
    host='localhost', user='root', passwd='********', db='horse_test', charset='utf8')
cursor = connect.cursor()

# プロフィールの項目
profile_key_list = ['登録', '品種', '性別', '生年月日', '馬主', '毛色',
                    '調教師', '生産牧場', '産地', '戦績', '総賞金',
                    '市場取引', '繋養先', '種付料']
profile_dict = {i: [] for i in profile_key_list}
profile = {i: [] for i in profile_key_list}

start = 742976
stop = start

while start <= stop:

    url = urllib.request.urlopen('http://www.jbis.or.jp/horse/' + '{0:010d}'.format(start) + '/')
    html = BeautifulSoup(url, 'lxml')

    try:
        name_ja = html.find('h1', class_='hdg-l1-02').text
        name_en = html.find('div', class_='sup').text.strip().splitlines()[0]
        if name_ja == '_________':
            name_ja, name_en = 'unknown', 'unknown'
        elif '現在' in name_en:
            name_en = None
    except:
        name_ja,name_en = None, None

    try:
        country = re.search(re.compile(r'\(.+?\)'), (name_ja + name_en))[0]
    except:
        country = 'unk'
    name_ja, name_en = name_ja.replace(country, ''), name_en.replace(country, '')
    if name_en == '':
        name_en = None
    country = country.replace('(', '').replace(')', '')

    try:
        profile_table_html = html.find_all('table', class_='tbl-data-05')
        profile_table_text = profile_table_html[0].text.replace(' (アラブ血量)', '\n')
        profile_list = [i for i in profile_table_text.splitlines() if i not in ['', u'\xa0']]
    except:
        profile_list = []

    key = profile_list[0]
    assert key in profile_list

    for i in profile_list[1:]:
        if i in profile_dict:
            key = i
        elif i.strip() == '写真':
            break
        else:
            profile_dict[key].append(i.strip().replace(u'\u3000', ''))

    for i in profile_dict:
        profile[i] = ''.join(profile_dict[i])

    cursor.execute('insert into horse \
                    (id, name_ja, name_en, country, \
                     state, kind, sex, date_of_birth, owner, coat_color, \
                     trainer, breeding_farm, producting_area, past_performance, earning, \
                     market, maintin_farm, stud_fee \
                    values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)' %
                    (start, name_ja, name_en, country,
                     profile['登録'], profile['品種'], profile['性別'],
                     profile['生年月日'], profile['馬主'], profile['毛色'],
                     profile['調教師'], profile['生産牧場'], profile['産地'],
                     profile['戦績'], profile['総賞金'],
                     profile['市場取引'], profile['繋養先'], profile['種付料']))

    start += 1

# 保存
connect.commit()
connect.close()

以上、よろしくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/07/28 21:38

    「Python」もタグに追記しておいてください。DBへアプローチしている言語がある場合はその言語仕様も関係してきます。

    キャンセル

  • mts10806

    2018/07/28 21:39

    前の質問と同問題のように思いますが、新たに質問をたてる必要はあったのでしょうか・・・? https://teratail.com/questions/138314

    キャンセル

  • RenNearco

    2018/07/28 22:01 編集

    すみません後ほど修正させていただきます。前の質問はSQLというよりpythonでの問題だと思っていたのですが、回答していただいた通り修正したところSQLでの問題だと思ったので、今回新たに質問させていただきました。

    キャンセル

回答 2

+2

下記のエラーを見ると、文字データなのに'で括られてませんね。

mysql.connector.errors.ProgrammingError: 1064 (42000): 
 You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version 
for the right syntax to use near 
'values (742976, ディープインパクト, Deep Impact, JPN, 繁殖, サラ, ' at line 1


%sを`で括らないと駄目なんじゃないかな。

後はINSERT構文の誤り

insert into テ―ブル名(カラム名・・・) values (値・・・)

valuesの前に)が無いですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/01 01:32

    valuesの前に)を付けても同様のエラーが出てしまいます。

    %sを'で括ると下記のエラーが出てしまいます。
    values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')' %
    ^
    SyntaxError: invalid syntax

    キャンセル

  • 2018/08/01 02:09

    エスケープするとか、全体を"で括るとか

    キャンセル

check解決した方法

0

valuesの行を下記の通りにしたら無事挿入できました。
旧:values (%s, %s, …… %s, %s)' %
新:values (%s, %s, …… %s, %s)',

cursor.execute('insert into horse \
                (id, name_ja, name_en, country, \
                 state, kind, sex, date_of_birth, owner, coat_color, \
                 trainer, breeding_farm, producting_area, past_performance, earning, \
                 market, maintin_farm, stud_fee) \
                values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)',
                (start, name_ja, name_en, country,
                 profile['登録'], profile['品種'], profile['性別'],
                 profile['生年月日'], profile['馬主'], profile['毛色'],
                 profile['調教師'], profile['生産牧場'], profile['産地'],
                 profile['戦績'], profile['総賞金'],
                 profile['市場取引'], profile['繋養先'], profile['種付料']))

回答してくださった方ありがとうございました。
(о´∀`о)(*´∇`*)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Python

    9225questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • MySQL

    6188questions

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

  • SQL

    2557questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。