ぺーぱーふぇいすスマートフォン用の表示で見るぺーぱーふぇいす雑記と備忘録。SQLitePythonを使ってSQLiteを扱う。買おうかなと思ってる本サンプルテーブルこのエントリで扱うサンプルのテーブルはこんな感じ。B上表の通り、氏名と性別と血液型を格納したシンプルな名簿がサンプル1。最大100件あるが、ここでは上位10件のみ。取得SELECTでデータを取得し、DataFrameに格納する。秀司SELECTする時はPandasのread_sql_query()を使う。引数に実行するSELECTクエリ、コネクションを渡せば結果がDataFrameとして返却される。DataFrameのカラム名にはSELECT結果のカラム名がそのまま入る。サンプルコードに記載した通りパラメタクエリも使えるので、通常のPythonでsqlite3モジュールを使う時と同様にクエリにパラメタを仕込める。挿入INSERTを行うサンプルコード。テーブルに新規レコードを挿入する。AINSERTを行うにはINSERTする対象のテーブルと同じカラムを含むDataFrameを準備する。サンプルコードでは、DataFrameオブジェクトのdfにSELECT結果1行分を行っている。下記抜粋の通り、INSERT用のDataFrameオブジェクトdf_insに書き込むデータを準備する。DataFrameのカラム要素はテーブルのカラム構造と同一にするので......columns=df.columnsと先ほど1件だけ取得したDataFrameのカラム情報をそのまま渡してコピーしている2。u"ketsueki"]といった感じに自力でカラム情報を作成するのもありかも3。columns=df.columns)準備したDataFrame(ここではdf_ins)の.to_sql()を使う。.to_sql()はINSERTするテーブル名、コネクション、if_existsパラメータは挿入のため'append'としておく。テーブルまるごとをDataFrameのレコードで入れ替える場合は'replace'とする。この辺のDataFrame.to_sql()に関するあれこれは下記参照。documentationhttps://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html大量のレコードを一度にINSERTしたい場合等は、カラム定義がINSERT先のテーブルと一致したDataFrameを準備すれば良いので楽なのでfor文などのループでINSERTクエリを組み立てては発行するよりもかなり楽だと思う。結果的に、DataFrame内のキーなどを判別して自動でUPDATEを発行したり、それに基づくクエリを構築してくれたりといったことは無いみたい。いい方法があったらここに追記するかもだけど。ここは泥臭くUPDATEするレコードに対しては自力でUPDATEクエリを組むしかないみたい。余談SQLite以外は?SQLite以外の他のDBMSのSELECT結果をDataFrameで取得したり、INSERTやUPDATEを行うには同じ手法で行けるのか?答えとしては、DataFrame.to_sql()等に渡すコネクションを換えて上げれば同じように動作する。MySQLの場合は下記のような感じになるっぽい。index=False)ただし、あんまり検証していないのでこの辺は後で要確認。Framework系の言語(C#、VisualBasic)にはDataSetとかDataTableなる便利なものがあったので、メモリが許すならある程度のレコードを取得して、2次元表のイメージのままデータをアレコレできた。PythonだとそれにあたるのがDataFrameだろうか。使い勝手はだいぶ違うけど、感覚は近い。こんな言い方をすると詳しい人からすると辛辣なツッコミが入るかもだが。DataTableはLINQを使ってレコード操作が可能。DataFrameも特定の条件を元に抽出やソートを行うことができるので、そのうちそういうカンペでもまとめておこうかな。単行本(ソフトカバー)この商品を含むブログを見るサンプルは自前のテストデータジェネレータ(姓、名の組み合わせ)からランダム生成したもの。実在の人物と名称が一致してもなんら関係はありません。↩もっと良い方法があるかも。»プロフィールid:PaperFace雑記と備忘録。キズナアイハロー・ワールドはてなブログをはじめよう!PaperFaceさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。