djangoで、フツーのSQLって実行できんの?
djangoって便利だよね✨ORMでDBにアクセスできるもん。
でもさ、たまーに、自分でSQL作って実行したいときない?アタシはある。
djangoがサポートしてないDBにアクセスしたいときとかね。
そーゆーときは、pyodbcを使うといんだって😊
pyodbcてなに?
👆ここにwikiがあんだけど、みんな読むのめんどーだと思うから、
あたしが解説してくね。
pyodbcってのは、pythonでいろんなDBにアクセスできるようにしてくれてるライブラリなんだよね。まじ便利ぢゃん🥰
まずpyodbcをインストールしよ。インストールは簡単。
コマンドラインで、python仮想環境に入って、👇のコマンドを実行するだけ⭐
> pip install pyodbc
インストールできたら、じゃんじゃんコード書いてこっ!
下のコードは、基本的に、動作確認はしてるけど、間違ってる情報があるかもしれないから、自分でも調べてみて😉調べるのマジ大事卍
それでは、いってみよ👆👆
コード全文
dbaccess.py
import pyodbc
conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};
SERVER=localhost;
DATABASE=test;
UID=user;
PWD=password')
cursor = conn.cursor()
cursor.execute("SELECT user_id, user_name FROM users")
row = cursor.fetchall()
解説してくよ
ドライバの設定
1行目のconnの部分でドライバを設定してんの。
DRIVER={ODBC Driver 17 for SQL Server}👈このDRIVERってなに?て人は、
以下から確認できるよ。
コンパネ>管理ツール>ODBC データ ソース>「ドライバー」タブ
ちな、同じODBCデータソースの画面でDSNを設定すると、ドライバ情報とかを一括管理できんの、なにアンタめっちゃかしこじゃん💖
その場合はこんな感じで書ける、マジシンプルだよね。
conn = pyodbc.connect('DSN=mynewdsn;UID=user;PWD=password')
SQLの設定
cursor.executeのとこで、SQLを入れ込んでんだよね。
execute関数は、パラメータも渡せんの👇
cursor.execute("""
select user_id, user_name
from users
where last_logon < ?
and bill_overdue = ?
""", datetime.date(2001, 1, 1), 'y')
つまりこれは
select user_id, user_name
from users
where last_logon < datetime.date(2001, 1, 1)
and bill_overdue = 'y'
を実行するのと同じってこと。大丈夫そ?
SQLの実行
selectを実行したときは、 fetchone(), fetchall(), fetchmany()なんかの関数を使えんの。
検索結果ないときは、
fetchone()はnoneが、 fetchall(), fetchmany()は空のリストが返ってくるよ。
検索結果あるときは、
fetchone()はクエリの1行を、fetchall()はクエリの全行をリストで返してくれる。
けどさ、これはすべての行をメモリに読み込んじゃうの、だからさ、行が多い場合はマジ気を付けて。
代わりに、行を反復処理することを検討したほうがいい。らしい。
検索結果にはカラムインデックスでも名前でもアクセスできんの。
row = cursor.fetchone()
print(row[1])
print(row.user_name)
👆どっちも同じ結果がprintされるよ。
1行目の1列目だけ欲しいときは、fetchval()を使ってもいいかもね。
検索結果が複数行の時は、最初の1行目の1列目だけ返ってくる。
検索結果なしの場合はnoneだよ。
maxid = cursor.execute("select max(id) from users").fetchval()
こうすると、max(id)だけ返ってってくる。いちいち行回さなくていいから楽✨さいこー💘
長くなっちゃったから、これで終わんね。
みてくれてあんがと💜またね✨