SQLの窓

2018年04月14日


Python 3.6 で GET/POST メソッドを想定した CGI 用の簡易テンプレートを作成してみました

Eclipse で実行させるのと、WWWサーバー( ここでは AN HTTP Server )で実行させるのとでは、やはりもっといろいろな切り口の理解が必要になります。

とにかく、CGI としてベタな QUERY_STRING を使用してベタな format で作成後、f-stringヒアドキュメントで HTML 部分を簡潔にして、最後に cgi モジュールで GETとPOST を兼用にしました。(FieldStorage() の戻りの内容が変更できないようなので、単純な dict に入れ替えています。)

▼ GET/POST 共用 : 結局 cgi モジュール で作成 : f-string ヒアドキュメント埋め込み
import cgi
import cgitb
cgitb.enable()

import sys
import io
import os
import urllib.parse

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

print("Content-Type: text/html; charset=utf-8")
print( "Expires: Thu, 19 Nov 1981 08:52:00 GMT" )
print( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" )
print( "Pragma: no-cache" )
print()

form = cgi.FieldStorage()

fields = {}
fld_names = {"氏名": "field1", "フリガナ":"field2"}
for value in fld_names.values():
	if value not in form:
		fields[value] = ""
	else:
		fields[value] = form[value].value

out_client = f"""<!DOCTYPE html>
<html>
<head>
</head>
<body>
	<form method="post">
		<p>氏名 : <input type="text" name="{fld_names["氏名"]}" value="{fields[fld_names["氏名"]]}"></p>
		<p>フリガナ : <input type="text" name="{fld_names["フリガナ"]}" value="{fields[fld_names["フリガナ"]]}"></p>
		<p>送信 : <input type="submit" name="send" value="送信"></p>
	</form>
</body>
</html>"""

print(out_client)

▼ GET のみ f-string を使った、ヒアドキュメント埋め込み
import cgitb
cgitb.enable()

import sys
import io
import os
import urllib.parse

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

print("Content-Type: text/html; charset=utf-8")
print( "Expires: Thu, 19 Nov 1981 08:52:00 GMT" )
print( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" )
print( "Pragma: no-cache" )
print()

try:
	qs = os.environ["QUERY_STRING"]
except KeyError as e:
	qs = ""

get =  urllib.parse.parse_qs(qs)

fld_names = {"氏名": "field1", "フリガナ":"field2"}
for value in fld_names.values():
	if get.get(value) is None:
		get[value] = [""]

out_client = f"""<!DOCTYPE html>
<html>
<head>
</head>
<body>
	<form>
		<p>氏名 : <input type="text" name="{fld_names["氏名"]}" value="{get.get(fld_names["氏名"])[0]}"></p>
		<p>フリガナ : <input type="text" name="{fld_names["フリガナ"]}" value="{get.get(fld_names["フリガナ"])[0]}"></p>
		<p>送信 : <input type="submit" name="send" value="送信"></p>
	</form>
</body>
</html>"""

print(out_client)

▼ GET のみ : format を使った、クォートの作成が面倒な埋め込み
import cgitb
cgitb.enable()

import sys
import io
import os
import urllib.parse

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

print("Content-Type: text/html; charset=utf-8")
print( "Expires: Thu, 19 Nov 1981 08:52:00 GMT" )
print( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" )
print( "Pragma: no-cache" )
print()

try:
	qs = os.environ["QUERY_STRING"]
except KeyError as e:
	qs = ""

get =  urllib.parse.parse_qs(qs)

fld_names = {"氏名": "field1", "フリガナ":"field2"}
for value in fld_names.values():
	if get.get(value) is None:
		get[value] = [""]

out_client = """<!DOCTYPE html>
<html>
<head>
</head>
<body>
	<form>
		<p>氏名 : <input type="text" name=\"""" + fld_names["氏名"] + """\" value="{""" + fld_names["氏名"] + """}"></p>
		<p>フリガナ : <input type="text" name=\"""" + fld_names["フリガナ"] + """\" value="{""" + fld_names["フリガナ"] + """}"></p>
		<p>送信 : <input type="submit" name="send" value="送信"></p>
	</form>
</body>
</html>"""

out_client = out_client.format(
	field1=get.get(fld_names["氏名"])[0],
	field2=get.get(fld_names["フリガナ"])[0]
)

print(out_client)

AN HTTP Server の設定



テストにはまだまだ使える(重宝する) AN HTTP Server の正しい使用方法



タグ:Python CGI
posted by lightbox at 2018-04-14 21:19 | Python | このブログの読者になる | 更新情報をチェックする

2018年04月09日


Eclipse + Python(Pydev) : pywin32(COM使用の為) + MySQL Connector/ODBC でループ処理をしながら更新

前提条件

Eclipse は Pleiades Eclipse 4.7 Oxygen です。前提となる環境は以下を参照して下さい。

Pleiades Eclipse 4.7 Oxygen 2 Windows 64bit Ultimate Full Edition のインストールといろいろな準備
Pleiades Oxygen 2 の XAMPP 内の MySQL を利用可能にしてテストデータ(販売管理)を登録する

▼ プロジェクトの作成方法はこちらを参照して下さい
Pleiades Eclipse 4.7 Oxygen で Python を使って MySQL にアクセスする

pywin32 + COM

COM 経由で ADO を使って MySQL にアクセスする為に、pywin32 をインストールします。

インストールは、pip install pywin32 でインストールできます。但し、『Fatal error in launcher: Unable to create process using '"'』というエラーが出た場合は、以下のコマンドを実行してから再度実行して下さい。
python -m pip install -U pip
pywin32 の readme にもありますが、さらに『COMオブジェクトの登録やWindowsサービスの実装などの「システムワイド」機能でpywin32を使用する場合は』管理者権限のコマンドプロンプトから以下を実行します
python Scripts/pywin32_postinstall.py -install
▼ 実行結果
Copied pythoncom36.dll to C:\WINDOWS\system32\pythoncom36.dll
Copied pywintypes36.dll to C:\WINDOWS\system32\pywintypes36.dll
Registered: Python.Interpreter
Registered: Python.Dictionary
Registered: Python
-> Software\Python\PythonCore\3.6\Help[None]=None
-> Software\Python\PythonCore\3.6\Help\Pythonwin Reference[None]='C:\\pleiades\\python\\3\\Lib\\site-packages\\PyWin32.chm'
Pythonwin has been registered in context menu
Creating directory C:\pleiades\python\3\Lib\site-packages\win32com\gen_py
Shortcut for Pythonwin created
Shortcut to documentation created
The pywin32 extensions were successfully installed.
Connector/ODBC 5.3.10 ADO から接続する場合、純粋に Windows からのアクセスになるので ODBC ドライバが必要になります。Python が 64ビットならば、ODBC ドライバも 64ビット用が必要になります。 ダウンロードページ com_ado_mysql 以下は、ADO + COM で行われる標準的なレコードセットの読み込みと同時更新の処理です。 特徴的なのは、レコードセットの Fields コレクション( Field オブジェクト )を使用して値を直接セットして一行づつレコードを更新するところです。
import win32com.client

adOpenDynamic = 2
adLockOptimistic = 3

cn = win32com.client.Dispatch("ADODB.Connection")
rs = win32com.client.Dispatch("ADODB.Recordset")

driver = "{MySQL ODBC 5.3 Unicode Driver}"
server = "localhost"
DB = "lightbox"
User = "root"
Pass = ""

ConnectionString = "Provider=MSDASQL;Driver={0};Server={1};DATABASE={2};UID={3};PWD={4};"
ConnectionString = ConnectionString.format(driver,server,DB,User,Pass)
print(ConnectionString)

"""""""""""""""""""""""""""
接続
"""""""""""""""""""""""""""
try:
	cn.Open( ConnectionString )
except Exception as e:
	print( e )
	exit()

rs.CursorType = adOpenDynamic
rs.LockType = adLockOptimistic

rs.Open( "select * from 社員マスタ where 社員コード <= '0004' ", cn )

while not rs.EOF:

	print(rs.Fields("社員コード").Value,end=",")
	print(rs.Fields("氏名").Value, end=",")
	print(rs.Fields("フリガナ").Value, end=",")
	print(rs.Fields("所属").Value, end=",")
	print(rs.Fields("性別").Value, end=",")
	print(rs.Fields("給与").Value, end=",")
	print(rs.Fields("手当").Value, end=",")		# NULL の場合は None と出力
	print(rs.Fields("管理者").Value, end=",")
	print("{0:%Y/%m/%d}".format(rs.Fields("作成日").Value), end=",")
	print("{0:%Y/%m/%d}".format(rs.Fields("更新日").Value), end=",")
	print("{0:%Y/%m/%d}".format(rs.Fields("生年月日").Value))

	rs.Fields("管理者").Value = "0002"
	rs.Update()

	rs.MoveNext()

"""""""""""""""""""""""""""
接続解除
"""""""""""""""""""""""""""
if cn.State >= 1:
	cn.Close()

print("終了しました")

CursorTypes, LockTypes, and CursorLocations

※ MySQL は 以下の三つの組み合わせのみ動作
adUseClient/adOpenStatic
adUseServer/adOpenForwardOnly
adUseServer/adOpenDynamic

※ ADO でデフォルトは adUseServer

エディタのタブ設定



エディタの # コメント色

デフォルトが灰色で見にくいので濃い緑を使用しました





posted by lightbox at 2018-04-09 16:52 | Python | このブログの読者になる | 更新情報をチェックする

Eclipse + Python(Pydev) : MySQL Connector/Python でループ処理をしながら更新

前提条件

Eclipse は Pleiades Eclipse 4.7 Oxygen です。前提となる環境は以下を参照して下さい。

Pleiades Eclipse 4.7 Oxygen 2 Windows 64bit Ultimate Full Edition のインストールといろいろな準備
Pleiades Oxygen 2 の XAMPP 内の MySQL を利用可能にしてテストデータ(販売管理)を登録する

▼ プロジェクトの作成方法と Connector/Python のインストールはこちらを参照して下さい
Pleiades Eclipse 4.7 Oxygen で Python を使って MySQL にアクセスする

update.py
'''
****************
Pydev パッケージ無し
****************
'''

import mysql.connector
import pprint

import sql_string

''' PHP の関数名を使ってます => print_r '''
print_r = pprint.PrettyPrinter(indent=4)

''' 読み込み用 '''
cnn = mysql.connector.connect(
	host='localhost',
	port=3306,
	db='lightbox',
	user='root',
	passwd='',
	charset="utf8")

cursor = cnn.cursor()

''' 更新用 '''
cnn2 = mysql.connector.connect(
	host='localhost',
	port=3306,
	db='lightbox',
	user='root',
	passwd='',
	charset="utf8",
	autocommit='True')

cursor2 = cnn2.cursor()

'''
****************
行単位でアクセス
****************
'''
cursor.execute(sql_string.query)

for row in cursor:
	print_r.pprint(row)

	update_sql = ( "update 社員マスタ set 管理者 = %s where 社員コード = %s " );
	cursor2.execute( update_sql, ( '0001', row[0] ) )

''' 更新用 '''
cursor2.close()
cnn2.close()

''' 読み込み用 '''
cursor.close()
cnn.close()


sql_string.py
query = "select * from 社員マスタ where 社員コード <= '0004' "

一般的な使い方通り、読み込みと更新では接続を分けています。更新用の接続では、デフォルトでは autocommit が False なので True にして接続しています。

▼ MySQL 公式ドキュメント
Connector/Python Connection Arguments

エディタのタブ設定



エディタの # コメント色

デフォルトが灰色で見にくいので濃い緑を使用しました






posted by lightbox at 2018-04-09 12:05 | Python | このブログの読者になる | 更新情報をチェックする

2018年04月03日


Pleiades Eclipse 4.7 Oxygen で Python を使って MySQL にアクセスする

1) 前提条件

以下のリンク先で、Pleiades Eclipse 4.7 Oxygen の導入について解説しています。

Pleiades Eclipse 4.7 Oxygen 2 Windows 64bit Ultimate Full Edition のインストールといろいろな準備

以下のリンク先で、Pleiades Eclipse 4.7 Oxygen 2 Windows 64bit Ultimate Full Edition 内の MySQL のセットアップについて解説しています。

Pleiades Oxygen 2 の XAMPP 内の MySQL を利用可能にしてテストデータ(販売管理)を登録する

2) MySQL の Python コネクタのインストール

Pleiades Eclipse 4.7 Oxygen 2 Windows 64bit Ultimate Full Edition には、Python 3.6 が入っています。MySQL 用の Python 3.6 用のコネクタは、Development Releases タブよりダウンロード(64ビットのみです)します。

Download Connector/Python


▼ ファイル
mysql-connector-python-8.0.6-rc-py3.6-windows-x86-64bit.msi

ここで重要なのは、Windows インストーラで Python3.6 が Windows に登録されていないと、このコネクタがインストールを拒否するので、いったん Python 3.6 をインストールして MySQL 用のコネクタをそこにインストールさせてから、Pleiades Eclipse 4.7 Oxygen 2 Windows 64bit Ultimate Full Edition の C:\pleiades\python\3 フォルダの Lib\site-packages にコピーをします。( ディスクに余裕があるならば、Windows インストーラでインストールした Python 3.6 はそのままでもいいでしょう )

コピーするのは mysql と mysqlx フォルダの二つです。

Python 3.6 ダウンロードページ


▼ ファイル
python-3.6.5-amd64.exe

▼ Python 3.6.5 インストール




ここで、後からの運用で使う場合を想定して浅い場所にインストールします。ただ注意すべきは、以前に Python を別の場所にインストールして削除した事があると、古いほうのディレクトリに MySQL のコネクタがインストールされるおそれがあります。( C:\Users\lightbox\AppData\Local 等を探して下さい ) 





▼ この Python を Eclipse で新しいインタープリタで登録してもかまいません


Python のインストールが完了したら、mysql-connector-python-8.0.6-rc-py3.6-windows-x86-64bit.msi を実行してコネクタをインストールします。そして、"C:\Python36\Lib\site-packages\mysql" と "C:\Python36\Lib\site-packages\mysqlx" のフォルダを "C:\pleiades\python\3\Lib\site-packages" 内にコピーします。

3) Eclipse の Python パースペクティブで MySQL に接続して実行

Eclipse 用の Python で使用するワークスペース用フォルダを作成しておいて選択します。



Python パースペクティブを選択します。



手順1) 注意事項

Pleiades Eclipse 4.7 Oxygen 2 Windows 64bit Ultimate Full Edition でワークスペースを最初に開くと、『システム PYTHONPATH の変更が検出されました』と出るので、とにかくこれは避けれなかったので適用します。



また、Python と Ruby では、RemoteSystemsTempFiles が作成されてしまいます。あっても問題無いですが、削除したい場合は『Pleiades Oxygen : Python と Ruby のパースペクティブでワークスペースを開いて最初に現れる『RemoteSystemsTempFiles』を削除する』を参照して下さい。

手順2) プロジェクト作成



プロジェクト名を入力して、python3 を選択します( Pleiades に同梱の Python です )



手順3) パッケージ作成
必ずしもパッケージは必要ありません。この位置を直接 WWW サーバに登録する場合は、逆にパッケージは無いほうがいいと思います。(import するのに Pydev のパッケージ内ではカレントの参照で都合が悪いようです)
手順4) モジュール作成 ※ フォントの変更は ウインドウ => 設定 手順5) 実行の構成 Python の実行をダブルクリックすると新しい構成ウィンドウになるので、パッケージとモジュールを参照ボタンで参照してから実行します。 手順6) MySQL用のコードでテスト MySQL を起動して以下のコードを貼り付けて実行します。 ( MySQLの環境は Pleiades Oxygen 2 の XAMPP 内の MySQL を利用可能にしてテストデータ(販売管理)を登録する を参照して下さい )
import mysql.connector
import pprint

'''
接続
'''
cnn = mysql.connector.connect(
	host='localhost',
	port=3306,
	db='lightbox',
	user='root',
	passwd='',
	charset="utf8")


cursor = cnn.cursor()

'''
一回目
'''
cursor.execute("SELECT * FROM 社員マスタ")
for row in cursor:
	# 日本語変数
	(社員コード,氏名,フリガナ,所属,性別,作成日,更新日,給与,手当,管理者,生年月日) = row
	print(社員コード, end=" ,")
	print(氏名, end=" ,")
	print(フリガナ, end=" ,")
	print(所属, end=" ,")
	print(性別, end=" ,")
	print(給与, end=" ,")
	print(手当, end=" ,")
	print(管理者, end=" ,")
	print("{0:%Y/%m/%d}".format(作成日), end=" ,")
	print("{0:%Y/%m/%d}".format(更新日), end=" ,")
	print("{0:%Y/%m/%d}".format(生年月日))

'''
二回目
'''
cursor.execute("SELECT * FROM 社員マスタ")
row = cursor.fetchall()
print_r = pprint.PrettyPrinter(indent=4)
print_r.pprint(row)

'''
接続解除
'''
cursor.close()
cnn.close()

'''
****************
定義情報
****************
'''
from mysql.connector import(connection)
cnx = connection.MySQLConnection(
	host='localhost',
	port=3306,
	db='lightbox',
	user='root',
	passwd='',
	charset="utf8")

meta = cnx.cmd_query("SELECT * FROM 社員マスタ")
print_r.pprint(meta)
cnx.close()



エディタのタブ設定



エディタの # コメント色

デフォルトが灰色で見にくいので濃い緑を使用しました




関連する記事

Pleiades Eclipse 4.7 Oxygen 2 Windows 64bit Ultimate Full Edition のインストールといろいろな準備


Pleiades Oxygen 2 の XAMPP 内の FileZilla Server をインストールして使用する


Pleiades Oxygen 2 の XAMPP 内の MySQL を利用可能にしてテストデータ(販売管理)を登録する




posted by lightbox at 2018-04-03 14:00 | Python | このブログの読者になる | 更新情報をチェックする

2018年03月11日


Python 3.4 : インストールと最初にする事( Windows )

mysql-connector-python-2.1.7-py3.4-windows-x86-64bit.msi が一応、3.4 用なので。

Download Python から最新版をダウンロードしてインストールします。PATH 環境変数には登録されないので、自分で登録します。拡張子に対する定義は済まされています

コマンドプロンプトのインタープリタ(Python.exe)を、好きな場所のコマンドプロンプトで実行したい場合にのみ、PATH 環境変数に登録するといいと思いますが、バッチ処理を .bat から呼び出したいと思っているのなら、必ず登録します。

ソースコードは、UTF8Nで作成して実行しましたが、SHIFT_JIS のコマンドプロンプトには、きちんと日本語が表示されます。

0001.py ( utf8n )
import sys

# print([object, ...][, sep=' '][, end='\n'][, file=sys.stdout])


# 改行を出力しない
print("日本語表示", end="")
print("ソースは UTF8N", end="")
print("コマンドプロンプトはSHIFT_JIS", end="\n")

# デフォルトは改行表示
print("日本語表示")


# 標準エラー出力
print("エラー", file=sys.stderr)


str = "PATH環境変数は設定されません"
print("インストールで", str, sep="")


※ print関数は、カンマでつなげると連結されます
※ その際のセパレータを sep='' で指定します。この例は空文字
  ( つまり二つの文字列は連結されます )

※ import sys しないと、sys.stdout とか、sys.stderr とか動きません
※ sys.stdout と sys.stderr はリダイレクト先。
※ コマンドプロンプトから 0001.py 2> test.txt で、"エラー" は test.txt の中

※ 改行させずに、次の出力と連結させるには、end=""

※ sep= 、end= 、file= とかは、浮動パラメータで、順序は関係ありません
※ 最初の object, ... は、定置バラメータでその位置でのみ使えます
※ sys. は、Python マニュアルの sys (module) キーワードで参照


posted by lightbox at 2018-03-11 21:44 | Python | このブログの読者になる | 更新情報をチェックする

Python3.x : URL を読み出す( bytes から string )

response.read() で、バイナリとして読み込んで適宜デコードして使用するようです。サンプルは、『HOWTO Fetch Internet Resources Using The urllib Package』にあります。
0002.py ( utf8n )
import urllib.request

# response は、これ専用の単純なストリームになるようで、
# readline() が使えます
try:
	response = urllib.request.urlopen('https://lightbox.sakura.ne.jp/demo/syain-sjis.csv')
except urllib.error.URLError as e:
	print(e)
	exit()

text = response.read()

# その他のメソッド
# info は、サーバーからの http ヘッダ
print( response.info(), response.geturl() )


# そのまま print すると、b'..........' という bytes 表現になります
# sjis.htm は、shift_jis なので、decode("shift_jis")
#print( text )
print( text.decode("shift_jis") )

mk:@MSITStore:C:\user\py\Doc\python360.chm::/howto/urllib2.html
mk:@MSITStore:C:\user\py\Doc\python360.chm::/library/stdtypes.html#bytes.decode
上のパスは、windows にインストールされた chm を IE で見る為のものです(右クリックからプロパティで取れます)


posted by lightbox at 2018-03-11 21:40 | Python | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり