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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

SQL

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

2回答

460閲覧

virustotal api python3においての変数出力エラーについて

peromaron

総合スコア7

Python 3.x

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

SQL

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2018/03/20 04:23

編集2018/03/20 05:12

前提・実現したいこと

仮想上でpython3にてVirusTotalのApiを複数使用してその結果をデータベースに格納したいです。

■その上でsql文を書いているのですがsqlの構文が間違っているとエラーが吐かれます。

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

エラーメッセージ ```mysql.connector.errors.ProgrammingError: 1064 (42000): 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 '+= 1 where id = 1' at line 1 また、SQL文のどこが間違っているか調べるために直接SQL内にて打ってみた結果のエラー文になります。 ERROR 1064 (42000): 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 '%d' at line 1 ### 該当のソースコード ```ここに言語を入力 class Analysis: def __init__(self,analysis_id): #database接続 self.connect = mysql.connector.connect(user='root', password='', host='localhost', database='〇', charset='utf8') self.connect.autocommit = True self.cursor = self.connect.cursor(buffered=True) self.analysis_id = analysis_id self.cursor.execute('use 〇') self.analyse_url = "https://www.virustotal.com/vtapi/v2/url/scan" def virustotal(self): self.url = str(self.cursor.execute('select short_url from short_urls where id = %d' % (self.analysis_id))) #現在の時間 now = datetime.datetime.now() self.cursor.execute('select Max(id) from virustotal_api_keys') record = self.cursor.fetchone() mMax = record[0] #idの最大値をVirustotal_api_keysから取得 for m in range(mMax): #now.minuteとuse_timeが一緒 self.cursor.execute('select use_time from virustotal_api_keys where id = %d' % (m+1)) if str(now.minute) == str(record[0]): #この分に使った回数が4回かrecord = self.cousor.fetchone() self.cursor.execute('select use_numbers from virustotal_api_keys where id = %d ' % (m+1)) record = self.cursor.fetchone() if int(record[0]) == 4: #今見ているidが最大値を満たしているか if m + 1 == mMax: time.sleep(60) #sleepしたらidの探索を元に戻す m = -1 continue else: break else: self.cursor.execute('update virustotal_api_keys set use_numbers = 0 where id = %d' % (m+1)) break self.cursor.execute('select api_key from virustotal_api_keys where id = %d' % (m+1)); record = self.cursor.fetchone() self.apikey = str(record[0]) self.__calc() #table virustotal_api_keysのuse_time,use_numbersにnow,use_number+1をして格納 self.cursor.execute('update virustotal_api_keys set use_time = now(),use_numbers += 1 where id = %d' % (m+1)) ```### 試したこと この中のSQL文を試したところやはり%dに対して全てエラーを吐いているような気がしました。 %dには変数が入る予定です。 エラー文を見る限り%d以外の似た書き方をしてくださいと言われています。 ### 補足情報(FW/ツールのバージョンなど) Python3.5 mysql-connector-python データベース自体はMariaDBを使っています もしもSQL文において変数出力の書き方が間違っている場合どのように修正したらよいか教えていただきたいです。どうかよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

mysql.connector.errors.ProgrammingError: 1064 (42000): 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 '+= 1 where id = 1' at line 1

質問文からは列:idの型が分かりませんが、エラーメッセージを見る限りでは

sql

1use_numbers += 1

sql

1use_numbers = use_numbers + 1

■補足解説
Pythonプログラム上のSQL文字列と実際に実行されるSQLをごちゃ混ぜに認識している気がします。
質問文のSQL文字列で+=を使っている箇所は以下の部分です。

Python

1self.cursor.execute('update virustotal_api_keys set use_time = now(),use_numbers += 1 where id = %d' % (m+1))

エラーメッセージが以下のメッセージなので、SQL中の%dは変数展開されています。

SQL

1'+= 1 where id = 1'

実行するSQLを調べたい時は、print文を追加して以下のように分割できます。

Python

1sql = 'update virustotal_api_keys set use_time = now(),use_numbers += 1 where id = %d' % (m+1) 2# print文で表示される内容が実際に実行されるSQLです。 3print(sql) 4self.cursor.execute(sql)

■余談
1,commit文が質問文にはないのですが、適切なタイミングでcommitを忘れずにしてくださいな。
2,self.connectとself.cursorはAnalysisクラスにclose関数を追加してcontextlib.closingを使う形にするとclose忘れを防ぎやすくなります。
3,SQLインジェクション防止のためにSQLプレースフォルダを使う事を検討してくださいな。

投稿2018/03/20 05:23

編集2018/03/20 05:44
umyu

総合スコア5846

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

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

peromaron

2018/03/21 10:27

分かりやすく回答して頂きありがとうございました‼ エラー文自体は無事解決いたしました! 別のエラーをまた吐き始めましたがそれはまた別案件で出させていただこうと思います。 本当にありがとうございました。
guest

0

SQL文字列中に変数と意図している記述をしてもそれは単なる文字列です。

あくまで例ですけど、
'select use_time from virustotal_api_keys where id =' + %d
上記のようにSQLの文字列を組み立てるという風にして下さい。

追記

失礼しました。
printfのように文字列中を置き換えることができるんですね。

投稿2018/03/20 04:47

編集2018/03/20 05:39
sazi

総合スコア25138

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

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

umyu

2018/03/20 05:48

python 2.6時代以前の書き方ですね。pythonは文字列の書き方がいろいろあって(汗
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問