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

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

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

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

Q&A

1回答

2317閲覧

pythonでdataframeをSQL DBへINSERTする処理

olivier

総合スコア0

Python

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

0グッド

1クリップ

投稿2021/03/27 09:11

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
PythonでDataframeの中身をDBにInsertしようとした際に下記のメッセージが出ました。

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

Incorrect number of bindings supplied. The current statement uses 7, and there are 971 supplied.

971はデータフレームの行数、7はデータフレームの列数です。

該当のソースコード

python

1def insert_values_to_db(db_file_name): 2 conn = sqlite3.connect(db_file_name) 3 with conn: 4 sql = 'INSERT INTO raw_prices (code,date,open,high,low,close,volume) values(?,?,?,?,?,?,?)' 5 conn.executemany(sql,(output,)) 6 7db_file_name = '/content/drive/MyDrive/株_Python/raw_prices.db' 8insert_values_to_db(db_file_name)

試したこと

Google検索してみて、executemanyの第2引数はタプルにすると解決するという情報は出てきましたが、タプルにした後も同様のメッセージが出てしまいます。

補足情報(FW/ツールのバージョンなど)

Goodle colaboratoryでコードを書いています。

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

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

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

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

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

guest

回答1

0

タプルにしたら出来たのでやり方を記載してみます。
outputをDataFrameだとして…

python

1conn.executemany(sql,(output.itertuples(index=False)))

テストしてみたら、私の所では出来たのですが如何でしょうか。

(追記 2021/03/30)
dataframeの列名が全てDBのテーブルの列名に含まれていると次のような事もできるみたいです。
こちらは日付型の変換は不要なようです。

python

1output.to_sql('raw_prices',conn,if_exists='append',index=None)

投稿2021/03/28 07:12

編集2021/03/29 16:00
xail2222

総合スコア1497

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

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

olivier

2021/03/28 08:31

ご回答ありがとうございます。 ご指摘の通りoutputはDataframeです。 ご提示いただいたコード実行してみましたが、下記エラーが出ました。 >>Error binding parameter 1 - probably unsupported type.
xail2222

2021/03/28 10:14 編集

1番目のパラメータの型が、サポートされてないのでは。というメッセージですね。 登録できないデータを設定しているのでしょう。 私がテストした所、タプルとかのデータが入ってるとエラーになりました。 他はどんなパターンがあるかわかりません。 データベースの定義はどのようになっていますか? あと、データフレームのデータの内容はどのようになっていますか?
xail2222

2021/03/29 16:03 編集

1番目と書きましたが0番目から始まるので、実際には2番目でしたね。すみません。 で、2番目はdateなので日付型だと思いますが https://note.nkmk.me/python-pandas-dtype-astype/ dataframeでは、日付型はdatetime64(Timestamp型)で保持されるみたいです。 この型だとexecutemanyで登録は出来ないようです。 このためdataframeからタプルを作ったとしても、この方法では登録できないようです。 よって、data型の所を文字列に変換してdataframeのまま登録することになると思います。 と調べていると、ご存じかもしれませんがto_sqlというのがあったので回答に追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問