質問文にはテーブル定義とスクリプトをできるだけ記載してくださいな。
以下は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みたいな連番変数は使用目的が分かりづらいため、list
やdict
で管理するようにするか、個々の名前を正しく付けてくださいな。
2,今回の件とかが特にそうですが、cur.execute
で実行するのはSQL文字列なため、実行エラーが発生したときはprint関数で作成したsqlを出力して、SQLの構文エラーになっていないか確認してくださいな。
3,質問する時は
3-1,再現する手順、
3-2,期待されること、そして
3-3,その代わりに観察されたこと。
この3つを意識して質問して頂けると、回答しやすいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/13 13:49
2018/02/13 14:15
2018/02/13 14:16
2018/02/13 15:43
2018/02/13 23:45
2018/02/15 01:10