PostgreSQL
Up one levelWindows7 64bit にpythonをインストールしてPostgresqlにつなぐ
- Python2.6 python-2.6.6.amd64.msi
- psycopg psycopg2-2.3.1.win-amd64-py2.6-pg9.0.1-release.exe
Postgresql8.2サーバに接続できました。
- Category(s)
- python
- PostgreSQL
- The URL to Trackback this entry is:
- http://lightson.dip.jp/blog/seko/2399/tbping
クレドはどうした by マカロニ
今週は、マカロニさんと一緒にエクセルデータの集計をしました。 沢山の人から送られてきたエクセルファイルをフォルダにいれ、マクロのプログラムで一つのブックにしたあとで、色々な集計をするという内容です。 一つにまとめたデータをデータベースに取り込んで処理するつもりだったのですが、面倒になってきたので、とりあえずエクセルにまとめてごまかそう といったところ
「マイ クレド はどうしたんですか? 手間を惜しまないで、難しい方をやりましょう。」
と言われてしまいました。
二人で本を見ながら、データベースを作り、データを取り込んで、Zopeから見えるようになりました。 マカロニさんは初めての経験だったので、SQLのすごさに感動してしばらく口がきけません。
そして
「今まで書いてたマクロって何だったんですか? 普通の人は、これを知らないで死んじゃうんですよね? コンピュータの勉強してて良かった!!」
と喜んでくれました。
先生もやりがいがあります。
- Category(s)
- zope
- misc
- PostgreSQL
- The URL to Trackback this entry is:
- http://lightson.dip.jp/blog/seko/2324/tbping
Pythonでpostgresのフィールド名を取る
Pythonでデータベースにアクセスしたときは、いつもリストでデータを取っていました。 しかし、何個目が何のデータだったかをすぐに忘れてしまいます。 そこで、最近覚えたディクショナリを使って、データにアクセスできるようにしてみました。 ディクショナリのキーは、フィールド名にしてみました。 最初は、select文で指定したフィールドを使っていたのですが、sumで合計したときなどには不都合なので、データベースから取るようにしてみました。
import psycopg2
def get_value_from_db(sql_txt,dsn):
con =psycopg2.connect(dsn)
cur=con.cursor()
cur.execute(sql_txt)
r=cur.fetchone()
#cur.descriptionでフィールドの値がとれる
fields=[]
for item in cur.description:
fields.append(item[0])
values=[]
while r:
value_dic={}
#print r
for index,field in enumerate(fields):
value_dic[field]=r[index]
values.append(value_dic)
r=cur.fetchone()
cur.close()
con.close()
return values
#### main
dsn="dbname=food host=192.168.11.13 port=5432 user=postgres"
sql_txt="select item_group,sum(qty) as qty from plan group by item_group order by item_group"
for k in get_value_from_db(sql_txt,dsn):
print k['
>>>
{'item_group': 'fruit', 'qty': 27170L}
{'item_group': 'Junk food', 'qty': 15050L}
- Category(s)
- python
- PostgreSQL
- The URL to Trackback this entry is:
- http://lightson.dip.jp/blog/seko/1578/tbping
Psycopg2.0.6でZopeに接続できず 2.0.5.1でOK
CentOS5では、PostgreSQL8が標準のため、はじめてPsycopg2系列を使ってみました。
最新のバージョンはPsycopg2.0.6でsetup.py build , setup.py installでインストールはできました。
zopeへのインストールは、ZPsycopgDAをProductsにコピーするだけです。
PythonからPostgresへの接続は問題なくできたのですが、Zopeでデータベースコネクションを作ろうとする
'OperationalError: can't set encoding to'というエラーがでます。
検索したところバグのようです。
http://www.initd.org/tracker/psycopg/ticket/190
とりあえずpsycopg2.0.5.1を使ったらうまくいきました。
アンインストールの方法はよくわからなかったので、python以下のディレクトリにあるpsycopgのディレクトリを削除してから古いバージョンをいれました。
本件についてはあまり情報がないので書いておきます。
- Category(s)
- python
- zope
- PostgreSQL
CentOS5のPostgreSQLにPsycopg2をインストール(作成中)
CentOS5上のPostgerSQL8にPsycopg2をインストールしてみる。
テストはCentOS5のxenの上で動いているCentOS5で行った。
Domain0上でDomainUの起動
# xm create /setc/xen/domU1
DomainU1上でpsycopg2のインストール
2007年6月24日現在2.0.6が最新
# yum install postgresql-devel
$ wget http://initd.org/pub/software/psycopg/psycopg2-2.0.6.tar.gz
$ tar zxvf psycopg2-2.0.6.tar.gz
$ cd psycopg2-2.0.6
$ /opt/python2.3.6/bin/python setup.py build
$ su
# /opt/python2.3.6/bin/python setup.py install
$ cp -R /home/zope/src/psycopg2-2.0.6/ZPsycopgDA /var/zope/Products/
動作の確認
pgadminをインストール
ファイルをダウンロード
$ wget http://ftp2.jp.postgresql.org/pub/postgresql//pgadmin3/release/v1.6.3/fedora-core-6/rpm/pgadmin3-1.6.3-1.i386.rpm
- Category(s)
- linux
- PostgreSQL
- The URL to Trackback this entry is:
- http://lightson.dip.jp/blog/seko/1304/tbping
Zope2.8.8 on Windows をPostgreSQLに接続する方法
Zope2.6.4にDCOracle2を入れてOracleに、ODBCDAを使って別のマシン上にあるPostgreSQLに接続していたWindowsXPマシンがあるのですが、諸般の事情でZope2.8.8にバージョンアップすることになりました。
DCOracl2 のインストールは先日ブログに書いた方法で成功したのですが、ODBCDAが動かないことが判明しました。
そこで、今回はpsycopgに挑戦してみました。
http://www.stickpeople.com/projects/python/psycopg/にコンパイルされたものがあるのでそれを使います。
前準備
mx-Extensionsのインストール
http://www.egenix.com/files/python/eGenix-mx-Extensions.html#Download-mxBASEからWindows installer for Python 2.3 をダウンロードして、実行してみるとレジストリにpythonのパスが見つからないと出て進みません。
検索してみると次の様な記事がありました。
http://mail.zope.org/pipermail/zope/2005-July/160406.html
ここに書かれた第二案をやってみました。
- c:\Pythonというフォルダを作る
- 「スタート」-「ファイル名を指定して実行」でregeditと入力
- 「編集」−「新規」−「キー」で[HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.3\InstallPath] を作っていく。
- 値をc:\Pythonとする
- Windows installer for Python 2.3 でインストール完了
- c:\Pythonの下のファイルをフォルダーをすべて選択し、c:\Program Files\Zope2.8.2-final\binにコピーする。
- レジストリを削除
psycopg1.1.21をインストール
http://www.stickpeople.com/projects/python/psycopg/からwin-psycopg23.zipWinをダウンロードし解凍します。
libpq.dll and psycopg.pyd をC:\Program Files\Zope-2.8.8-final\bin\DLLsにコピーします。
ZpsycopgDAをインストール
http://initd.org/pub/software/psycopg/から psycopg-1.1.21.tar.gzをダウンロードします。
解凍するとZpsycopgDAというフォルダ中にあるので、それをC:\Program Files\Zope-2.8.8-final\lib\python\Productsにコピーします。(本当はインスタンスのProductsディレクトリの方がいいのかもしれないが違いが分からない)
Zopeを再起動して、Productが正常にはいっていることを確かめます。
これで、postgresqlにはアクセスできるようになりましたが文字化けします。調べてみると、このデータベースの文字コードはEUC_JPになっており、それがそのままhtmlファイルに出ているためと分かりました。
ちなみに、Oracleの方はSJIS、Zopeもshift_jisとなっています。
ODBCドライバを使ってpostgresqlに接続していたときは勝手にSJISに変換されていたようです。
postgresqlはサーバクライアント間の文字コード自動変更機能をもっているようです。
http://www.postgresql.jp/document/pg814doc/html/multibyte.html
今回はDBのencodingはEUC_JPなので、SJISやUTF-8ならこの機能が使えますが、そのためにはクライアントの文字コードが何かを伝えなくてはなりません。
Z Psycopg Databese ConnectioinにはBackend encoding:という項目があり、UTF-8がデフォルトになっています。
意味も分からず、この値をEUC_JPやSJISにしてみたが効果はありません。
第一案 SQLでEncodingを指定
Psycopgのdata connectionのテストで次のSQLを発行してみました。
SET CLIENT_ENCODING TO 'SJIS';
次のSQLでクライアントのencodeはSJISになっていることが確認され、Zope上の文字も正常に表示されます。
SHOW client_encoding;
この方法ではZopeのソースにこのSQLメソッドを追加しなくてはなりません。
第二案 環境変数の設定
Zopeを動かしているWindowXPの「コントロールパネル」-「システム」-「詳細設定」に行き、
「環境変数」に変数名:PGCLIENTENCODING 値:SJIS といれたところ、うまくいきました。
今回は環境変数で対応しましたが、、移植性を考えるとSQLの方がいいような気もします。
最後に、Data connectionの名前をODBCと同じにして、アプリはそのまま動きました。
すごいぞZope!!
以下は私の犯したミス。
最初にWin-PsycopgのリンクにあるZPsycopgDA-2.0.5.1.tar.gzを何の気なしにダウンロードしてを使ったところ、Productが壊れてしまい、次のようなエラーが出ました。
エラーメッセージを見れば分かりませすが、このDAはPsycopg2用のため、psycopg2というモジュールをロードしようとするのですが、当然存在しません。
気づくのにかなりの時間を使ってしまいました。もっとエラーメッセージに敏感になること。
Traceback (most recent call last):
File "C:\Program Files\Zope-2.8.8-final\lib\python\OFS\Application.py", line 695, in import_product
product=__import__(pname, global_dict, global_dict, silly)
File "C:\Program Files\Zope-2.8.8-final\lib\python\Products\ZPsycopgDA\__init__.py", line 23, in ?
import DA
File "C:\Program Files\Zope-2.8.8-final\lib\python\Products\ZPsycopgDA\DA.py", line 25, in ?
import db
File "C:\Program Files\Zope-2.8.8-final\lib\python\Products\ZPsycopgDA\db.py", line 26, in ?
import pool
File "C:\Program Files\Zope-2.8.8-final\lib\python\Products\ZPsycopgDA\pool.py", line 24, in ?
import psycopg2.pool
ImportError: No module named psycopg2.pool
- Category(s)
- python
- zope
- PostgreSQL
- The URL to Trackback this entry is:
- http://lightson.dip.jp/blog/seko/1125/tbping
Zopeで万歩計の記録 第一歩
一日1000歩、10分だけ余分に歩く、「ライフスタイルウオ-キング」にトライしているのだが、継続するには歩いた距離をグラフにするのが効果的らしい。
とりあえず、postgreSQLとZopeでここまでは作ってみた。*マーク一つが1000歩だ。
http://lightson.dip.jp/zope/walking/index_html
管理の単位としては、最終的には週が良いらしいので、日付から何週目かを計算してデータベースに保存するようにしたのだが、zope上のpythonでは動かず、外部プログラムにしたりして、けっこう大変だった。
入力画面は用意して、日々の追加はできるのだが、修正や削除などの管理画面ができていない。
とりあえずは、pgAdminとかでしのいで、徐々に作っていこうと思う。
- Category(s)
- python
- zope
- PostgreSQL
- The URL to Trackback this entry is:
- http://lightson.dip.jp/blog/seko/899/tbping
SQL書き方ドリル―すらすらと手が動くようになる
- Category(s)
- books
- PostgreSQL
- The URL to Trackback this entry is:
- http://lightson.dip.jp/blog/seko/174/tbping
そんな、都合のいい話はありませんか?
zopeサーバがwindowsならodbcドライバを入れてつなぐという方向もありますね。
明日やってみます。