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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

5545閲覧

pythonのSQLiteAPIのexecuteメソッドの文法エラー 文字列置換ができない

sandyur

総合スコア25

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2018/02/13 13:06

編集2018/02/13 23:46

pythonとSQLiteを用いて、sqliteファイルにデータを送信しようとしています。
pandasのdataframeにあるデータが保存されています。
execute文を用いて、python上からクエリを実行しようとしているのですが、
その際table名を直接打ち込むのではなく、変数から引っ張れるようにしたいです。
execute文の文法エラーから抜け出せず四苦八苦しているのでアドバイスを頂けるとうれしいです。

試したコード一覧

python

12cur.execute('CREATE TABLE ? ('column名'),(tablename)') 32. 4cur.execute('CREATE TABLE {}.format(tablename)('column名')') 53. 6cur.execute('CREATE TABLE %s %tablename('column名')') 74. 8cur.execute('CREATE TABLE '%s' %'tablename'('column名')') 9

エラーコードは以下になります。

--------------------------------------------------------------------------- OperationalError Traceback (most recent call last) <ipython-input-1818-343e6b2e2a93> in <module>() ----> 1 cur.execute('CREATE TABLE ? (tablename_new)(''変数1'', ''変数2'',''変数3'',''変数4'', ''変数5'', ''変数6'')') OperationalError: near "?": syntax error

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

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

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

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

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

guest

回答2

0

他の部分はわかりません。
SQLでは文字列中のシングルクォートはシングルクォートを2つ重ねて記述します。

SQL

1cur.execute('CREATE TABLE ? (''column名''),(tablename)')

投稿2018/02/13 13:09

編集2018/02/13 13:11
Orlofsky

総合スコア16415

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

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

sandyur

2018/02/13 13:49

試してみたところ、無事文法エラーを抜け出すことが出来ました! ありがとうございます!!
sandyur

2018/02/13 14:15

その後、?の近くに文法エラーがあると出るようになってしまいました・・・
sandyur

2018/02/13 14:16

お手数ですが、アドバイスいただけるとうれしいです。。。
Orlofsky

2018/02/13 15:43

差支えない限り、エラーメッセージは表示された内容をそのまま載せましょう。 で、回答してくれる人が現象を再現できるだけの情報を載せるのは質問者としての最低限のマナーです。
sandyur

2018/02/13 23:45

エラーコード記載しました、ご指摘ありがとうございます。
sandyur

2018/02/15 01:10

丁寧に教えてくださり、ありがとうございます。感謝します。
guest

0

ベストアンサー

質問文にはテーブル定義とスクリプトをできるだけ記載してくださいな。

以下はf文字列を使ったサンプルソースコードです。ご参考まで。

Python

1# -*- coding: utf8 -*- 2import sqlite3 3from contextlib import closing 4 5tablename = 'sample' 6 7 8def drop_table(cur: sqlite3.Cursor) -> None: 9 sql = f"drop table if exists {tablename}" 10 print(sql) 11 cur.execute(sql) 12 13 14def create_table(cur: sqlite3.Cursor) -> None: 15 column名 = 'id, rnd' 16 # f文字列を使う 17 sql = f"create table {tablename} ({column名})" 18 print(sql) 19 cur.execute(sql) 20 21 22def insert_data(cur: sqlite3.Cursor) -> None: 23 import random 24 random.seed(42) 25 row_count = 0 26 for i in range(10): 27 sql = f"insert into {tablename} values (?, ?)" 28 # bindパラメータを使用する tupleである点に注意 29 params = (i, random.randint(0, 500)) 30 cur.execute(sql, params) 31 row_count += cur.rowcount 32 33 print(f"rowcount:{row_count}") 34 35 36def select_data(cur: sqlite3.Cursor) -> None: 37 sql = f"SELECT * FROM {tablename} ORDER BY id" 38 print(sql) 39 cur.execute(sql) 40 for row in cur.fetchall(): 41 print(row) 42 43 44def main() -> None: 45 db_name = 'database.db' 46 with closing(sqlite3.connect(db_name)) as conn: 47 cur = conn.cursor() 48 drop_table(cur) 49 create_table(cur) 50 insert_data(cur) 51 select_data(cur) 52 # コミット忘れに注意! 53 conn.commit() 54 55 56if __name__ == '__main__': 57 main() 58

■余談
1,変数から値を生成するとのことなので、INSERTやUPDATEする時はSQL Injectionを回避するためにbindパラメータを使用してくださいな。
2,SQLiteのデータ確認にはDB Browser for SQLiteが便利です。

■参考情報
sqlite3
CREATE TABLE
Pythonでsqlite


2018/02/14追加

cur.execute('CREATE TABLE ? (tablename_new)(''変数1'', ''変数2'',''変数3'',''変数4'', ''変数5'', ''変数6'')')

OperationalError: near "?": syntax error

■翻訳
OperationalError:"?"近くに構文エラーがあります。
今回の場合はCREATE TABLE ? ←この?マークが構文エラーの原因です。

tablename_new の値と変数1~変数6の値が質問文には無いので推測で回答しますが、以下のような形になります。

Python

1tablename_new = 'sample_new' 2変数1 ="item" 3変数2 = "cost" 4変数3 = "price" 5変数4 = "amount" 6変数5 = "ctime" 7変数6 = "vender" 8column_names = ", ".join((変数1, 変数2, 変数3, 変数4, 変数5, 変数6)) 9sql = f"CREATE TABLE {tablename_new} ({column_names})" 10print(sql) 11cur.execute(sql)

■余談
1,変数1~6みたいな連番変数は使用目的が分かりづらいため、listdictで管理するようにするか、個々の名前を正しく付けてくださいな。

2,今回の件とかが特にそうですが、cur.executeで実行するのはSQL文字列なため、実行エラーが発生したときはprint関数で作成したsqlを出力して、SQLの構文エラーになっていないか確認してくださいな。

3,質問する時は
3-1,再現する手順、
3-2,期待されること、そして
3-3,その代わりに観察されたこと。
この3つを意識して質問して頂けると、回答しやすいです。

投稿2018/02/13 15:12

編集2018/02/14 03:16
umyu

総合スコア5846

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

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

sandyur

2018/02/13 23:45

回答ありがとうございます!エラーコード記載しました、ご指摘ありがとうございます。
sandyur

2018/02/15 01:12

文法エラーは脱出することが出来ました!ありがとうございます! 投稿のマナーが至らないことが多く、申し訳ありませんでした。以後改めます。
umyu

2018/02/15 01:44

問題が解決してよかったですー。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問