接続
import mysql.connector
# **************************************
# 接続 / 更新兼用
# **************************************
cnn = mysql.connector.connect(
host='localhost',
port=3306,
db='lightbox',
user='root',
passwd='',
charset="utf8",
autocommit=True)
# データベース処理
# **************************************
# 接続解除
# **************************************
cnn.close()
MySQLCursor.fetchone() Method
このメソッドはクエリ結果セットの次の行を取得し、単一のシーケンスを返し、使用可能な行がない場合はNoneを返します。
デフォルトでは返されたタプルはMySQLサーバから返されたデータで構成され、Pythonオブジェクトに変換されます。(カーソルが生のカーソルの場合そのような変換は行われません : 「cursor.MySQLCursorRawクラス」 )
fetchone メソッドは fetchall および fetchmany によって使用されます。 また、カーソルがイテレータとして使用さる場合にも使用されます。
次の例はカーソルをイテレータとして使用し、内部では fetchone が使用されます。
cursor.execute("SELECT * FROM employees")
for row in cursor:
print(row)
関数で処理
# ***************************
# 参照
# ***************************
def get_data( cnn ):
log("get_data")
cursor = cnn.cursor(dictionary=True)
sql = f"""select
社員コード,
氏名,
フリガナ,
所属,
性別,
作成日,
更新日,
給与,
手当,
管理者,
DATE_FORMAT(生年月日,'%Y/%m/%d') as 生年月日
from 社員マスタ
where 社員コード = '{forms("社員コード")}'"""
log(sql)
cursor.execute(sql)
row = cursor.fetchone()
if row is None:
set("check_message", "データが存在しません")
return False
pplog(row)
forms("氏名", row["氏名"])
forms("フリガナ", row["フリガナ"])
forms("給与", row["給与"])
forms("生年月日", row["生年月日"])
cursor.close()
return True
pplog の結果
{'フリガナ': 'ウラオカ トモヤ',
'作成日': datetime.datetime(2005, 9, 12, 0, 0),
'性別': 0,
'所属': '0003',
'手当': 9000,
'更新日': datetime.datetime(2005, 11, 28, 0, 0),
'氏名': '浦岡 友也',
'生年月日': '2001/01/10',
'社員コード': '0001',
'管理者': None,
'給与': 80000}
MySQLCursor.execute() Method
このメソッドは指定されたデータベース操作(クエリまたはコマンド)を実行します。
タプルまたはディクショナリ(PHP:連想配列/Ruby:ハッシュ)の値は、SQL文字列内の変数にバインドされます。
変数を%sまたは%(name)s として埋め込んで使用します。
▼ 例
select_stmt = "SELECT * FROM employees WHERE emp_no = %(emp_no)s"
cursor.execute(select_stmt, { 'emp_no': 2 })
▼ 非推奨
execute は、multiがTrueの場合はイテレータを返します。
Pythonでは、単一の値を含むタプルにカンマを含める必要があります。
たとえば ('abc') はスカラとして評価され、('abc',)はタプルとして評価されます。
print( type(('abc')) )
print( type(('abc',)) )
▼ 処理結果
<class 'str'>
<class 'tuple'>
関数で処理
# ***************************
# 更新
# ***************************
def update_data( cnn ):
log("update_data")
cursor = cnn.cursor()
# 文字列複数行連結
sql = f"""update 社員マスタ set
氏名 = %s,
フリガナ=%s,
給与 = %s,
生年月日 = %s
where 社員コード = '{forms("社員コード")}'"""
log( sql )
try:
data = (forms("氏名"), forms("フリガナ"), int(forms("給与")) , forms("生年月日") )
log( data )
cursor.execute(sql, data)
except:
error_info = str(sys.exc_info()[1])
set("check_message", "更新に失敗しました : " + error_info)
log(str(sys.exc_info()[0]))
log(error_info)
return False
cursor.close()
return True
sys.exc_info()
現在処理中の例外を示す 3 個のタプルを返します。
例外が発生している場合、(type, value, traceback) を返します。type は処理中の例外のクラス(BaseException のサブクラス)を示します。value は例外インスタンス (例外の型のインスタンス) を返します(エラーメッセージはここに格納されています)
▼ エラーメッセージ例(MySQL)
1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'aaa' at line 1
ログ関数
import pprint
# **************************************
# ログ出力
# **************************************
def log( message ):
with open('debug.log', 'a') as f:
print(message,end='\n',file=f)
# **************************************
# ログ出力( pprint )
# **************************************
def pplog( obj ):
with open("debug.log", "a") as f:
pprint.pprint(obj, stream=f)