galthonista’s blog

ギャルが教えるpython💅❤️‍🔥

djangoで、フツーのSQLって実行できんの?

djangoって便利だよね✨ORMでDBにアクセスできるもん。

でもさ、たまーに、自分でSQL作って実行したいときない?アタシはある。

djangoがサポートしてないDBにアクセスしたいときとかね。

そーゆーときは、pyodbcを使うといんだって😊

 

pyodbcてなに?

github.com

👆ここに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 データ ソース>「ドライバー」タブ

f:id:galthonista:20220413194810p:plain

 

ちな、同じ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)だけ返ってってくる。いちいち行回さなくていいから楽✨さいこー💘

 

長くなっちゃったから、これで終わんね。

みてくれてあんがと💜またね✨