実現したいこと
・Python SQLite3 を使用してデータベースを作成し、運用したいと考えています
・データフレーム df で用意した値をデータベースに書き込み、ユーザーが変更できる仕組みを作りたい
※やりたいこと※
①行ごと( df内の各idごと) にまとめて書込む
②データフレームの内容を一括で書き込む
前提
Python SQLite3 を学習し日が浅く、独学で少しづつ理解を深めている状況です。
特にデータベースについては今回初めて扱います。
id | date | item | price | quantity |
---|---|---|---|---|
1 | 2000-01-01 | さくらんぼ | 100 | 10 |
2 | 2000-01-01 | いちご | 200 | 20 |
3 | 2000-01-01 | ぶどう | 300 | 30 |
4 | 2000-01-01 | みかん | 400 | 40 |
5 | 2000-01-01 | かき | 500 | 50 |
6 | 2000-01-01 | りんご | 600 | 60 |
7 | 2000-01-01 | なし | 700 | 70 |
上記が使用するデータの初期値で、データフレームとして用意しました
idは固有の値です
1.空のデータフレームを作成
2.初期値を書き込む
ということをやりたいのですが、
[2.初期値を書き込む] の所で躓いています。
個別のデータとして execute('INSERT INTO を使用して書き込みはできたのですが、
例えば(1, '2000-01-01', 'さくらんぼ', 100, 10)をまとめて書込んだり、
データフレーム全体を書き込んだり、ということができていません。
困っている内容は、
①行ごと(1, '2000-01-01', 'さくらんぼ', 100, 10)で初期値を書き込む方法(INSERT INTO)
②データフレーム全体を初期値として書き込む方法(INSERT INTO)
全く知識の無いところからのスタートで、何日も手が止まってしまい困り果てています。
Python sqlite3 pandas その他もろもろ知識が不足していることは重々承知しております。
先輩方のお力添えを頂ければ幸いです<m(__)m>
発生している問題・エラーメッセージ
38行目にて下記エラー
例外が発生しました: ProgrammingError parameters are of unsupported type File "C:\python\webapp\codetest02.py", line 38, in <module> cur.executemany('INSERT INTO fruit_data VALUES(?,?,?,?,?)' , index_0) sqlite3.ProgrammingError: parameters are of unsupported type
該当のソースコード
python
1import pandas as pd 2import sqlite3 3 4#初期値をデータフレームとして用意 5list_df = pd.DataFrame({'id': [1 , 2 , 3 , 4 , 5 , 6 , 7], 6 'date': ['2000-01-01' , '2000-01-01' , '2000-01-01', '2000-01-01', '2000-01-01', '2000-01-01', '2000-01-01'], 7 'item': ['さくらんぼ', 'いちご' , 'ぶどう', 'みかん','かき','りんご' , 'なし'], 8 'price': [100 , 200 , 300 , 400 , 500 , 600 , 700], 9 'quantity': [10 , 20 , 30 , 40 , 50 , 60 , 70]}) 10 11# SQLiteに接続する 12conn = sqlite3.connect('fruit_data.db') 13# SQLiteを操作するためのカーソルを作成 14cur = conn.cursor() 15#変数query:の宣言 16query = "SELECT * FROM fruit_data" 17 18#デバッグの為、dbを一度初期化 19conn.execute('DROP TABLE IF EXISTS fruit_data') 20 21# テーブルを作成する 22cur.execute("CREATE TABLE IF NOT EXISTS fruit_data( \ 23 id INTEGER PRIMARY KEY, \ 24 date TEXT NOT NULL, \ 25 item TEXT NOT NULL, \ 26 price INTEGER NOT NULL, \ 27 quantity INTEGER NOT NULL)") 28 29#個別のデータではdb登録可能 30# cur.execute('''INSERT INTO fruit_data VALUES (1, '2000-01-01', 'さくらんぼ', 100, 10)''') 31 32#0行目index[0]をリストで取得・・・取得結果[1, '2000-01-01', 'さくらんぼ', 100, 10] 33index_0 = list_df.iloc[0].to_list() 34#0行目をタプルに変換・・・変換結果(1, '2000-01-01', 'さくらんぼ', 100, 10) 35tuple_index_0=tuple(index_0) 36 37#取得した行をリストで登録 38cur.executemany('INSERT INTO fruit_data VALUES(?,?,?,?,?)' , index_0) 39#取得した行をタプルで登録 40# cur.executemany('INSERT INTO fruit_data VALUES(?)' , tuple_index_0) 41 42# commitする 43conn.commit() 44# データベースをdfに書き出し表示する 45df = pd.read_sql_query(query,conn) 46print(df)
試したこと
個別のデータではdb登録可能でした…30行目
cur.execute('''INSERT INTO fruit_data VALUES (1, '2000-01-01', 'さくらんぼ', 100, 10)''')
行ごと登録の為、リストやタプルで取り出し、
executemany('INSERT INTO の所を色々と修正しましたがうまくいきませんでした。
32~38行目が試した内容です
補足情報(FW/ツールのバージョンなど)
python3.11
win11

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/10/22 06:10