標準じゃないやつ。python3.x系ではインストールできんやつがほとんど
- http://code.google.com/p/modwsgi/wiki/QuickConfigu... 手っ取り早くするなら
- http://code.google.com/p/modwsgi/wiki/VirtualEnvir... virtualenv環境での設定方法
- http://code.google.com/p/modwsgi/wiki/Configuratio... configuration guideline
- http://code.google.com/p/modwsgi/wiki/Configuratio... directives
- http://d.hatena.ne.jp/pyxis-dev/20080606/121277038... ちょっとしたわかりやすい説明など
werkzeugが動く環境を作る
cd $WORKON_HOME virtualenv --no-site-package --distribute develop cd develop . bin/activate pip install werkzeug
app.wsgi。werkzeugの例をそのままぱくる
#!/usr/bin/env python # vim: fileencoding=utf-8 import os import sys ## for auto activate(自分でactivateして動かす場合はこのコードは不要) here = os.path.dirname(os.path.abspath(__file__)) virtualenv = os.path.join(here, 'bin/activate_this.py') execfile(virtualenv, dict(__file__=virtualenv)) from werkzeug.wrappers import Request, Response from werkzeug.serving import run_simple @Request.application def application(request): return Response("Hello World!\n") if __name__ == '__main__': run_simple('127.0.0.1', 5000, application, use_reloader=True)
wsgi.confとか。名前は適当でいい。
細かい制御を行えるようにするのなら、WSGIDaemonProcess Directiveを使うほうがよさそう。
<IfModule wsgi_module> ServerName freebsd-develop.vbox.priv WSGIPythonPath /path/to/.virtualenv/develop/lib/python2.7/site-packages WSGIScriptAlias / /path/to/.virtualenv/develop/app.wsgi <Directory /path/to/.virtualenv/develop> Order deny,allow Allow from all </Directory> </IfModule>
細かい制御を行えるようにするのなら、WSGIDaemonProcess Directiveを使うほうがよさそう。
NameVirtualHost *:80 <IfModule wsgi_module> <Virtualhost *:80> ServerName freebsd-develop.vbox.priv # 本番環境ではoffのほうがいい WSGIScriptReloading Off( WSGIDaemonProcess yourapplication user=holly group=accounts processes=2 threads=5 python-path=/path/to/.virtualenv/develop/lib/python2.7/site-packages maximum-requests=1000 WSGIScriptAlias / /path/to/.virtualenv/develop/app.wsgi <Directory /path/to/.virtualenv/develop> WSGIProcessGroup yourapplication WSGIApplicationGroup %{GLOBAL} Order deny,allow Allow from all </Directory> </VirtualHost> </IfModule>この設定を行うとapacheの子プロセス2つがuserで指定したonwerのプロセスで、あとはthreadで設定した分が、その都度起動する。process/thread混合型。
指定バージョン
easy_install "<pkg> == 1.1"指定バージョン以下
easy_install "<pkg> < 1.1"とか。http://dsas.blog.klab.org/archives/51284317.htmlとかにもうちょい詳しく載っている
機能としてはないので
# $PYTHONLIB = /usr/lib/pythonx.x 自分でコンパイルしていれたのなら/usr/local/lib/pythonx.x grep -E "\.egg$" $PYTHONLIB/site-packages/easy-install.pth ./pyflakes-0.4.0-py2.4.egg ./pip-0.8.1-py2.4.egg ./psycopg2-2.3.0_beta1-py2.4-linux-i686.eggとすると一覧表示される
mで。例えばpipの場合
easy_install -m pip Searching for pip Best match: pip 0.8.1 Processing pip-0.8.1-py2.4.egg Installing pip script to /usr/bin Installing pip-2.4 script to /usr/bin Using /usr/lib/python2.4/site-packages/pip-0.8.1-py2.4.egg Because this distribution was installed --multi-version, before you can import modules from this package in an application, you will need to 'import pkg_resources' and then use a 'require()' call similar to one of these examples, in order to select the desired version: pkg_resources.require("pip") # latest installed version pkg_resources.require("pip==0.8.1") # this exact version pkg_resources.require("pip>=0.8.1") # this version or higher Processing dependencies for pipこれでインストール時の情報が表示されるので、$PYTHONLIB/site-packages/easy-install.pthから該当するパッケージのegg情報を削除する。あとはここに表示された関連するファイル(eggと実際にインストールされたファイルと)を削除すればよい。--record をインストール時に指定していた場合は指定したファイルにすべてインストールパスが記録されるので、
cat record.txt | xargs rm -frとすればよい
easy_installより便利らしいのでこっちも覚えておく。使おうとするとpython3だとsyntax errorとでる
ここが詳しい。http://d.hatena.ne.jp/rudi/20110107/1294409385
ここが詳しい。http://d.hatena.ne.jp/rudi/20110107/1294409385
ちゃんとある
pip freeze Flask==0.6.1 Jinja2==2.5.5 Werkzeug==0.6.2 distribute==0.6.14 wsgiref==0.1.2
依存モジュールもインストールしてくれるようだ
pip install pkgバージョン指定する場合は
pip install "pkg==x.x.x"x.x.xより上のバージョン(逆も可能)
pip install "pkg>x.x.x"などのようにする
virtualenvとpipを組み合わせる場合は意識することはないが
# --environment でもよい pip -E /path/to/virtualenv/sandbox install <pkg>とするとvirtualenvで作成したsandboxにpackageをインストールすることができる
コマンドがインストールされる。たぶん直接pyflakesのライブラリ本体を扱うことはあまりないようだ
#!/usr/bin/python import resource import fcntl import signal from signal import SIGTERM, SIGINT from resource import RUSAGE_SELF def handler(sig, flame): print "SIGNAL[%i] received" % sig signal.signal(SIGTERM, handler) signal.signal(SIGINT, handler) data = [] f = open("test.txt", mode="w") fcntl.flock(f, fcntl.LOCK_EX) for i in range(0, 10000): data.append("a" * i) f.write(str(i) + "\n") f.close() print resource.getrusage(RUSAGE_SELF)こんなソースがあるとして
pyflakes getrusage.pyとして何も表示されなければ、それで問題ない。例えば
#signal.signal(SIGTERM, handler) #signal.signal(SIGINT, handler)のようにはじめの例からコメントにした状態でpyflakesを実行すると
./getrusage.py:5: 'signal' imported but unused ./getrusage.py:6: 'SIGINT' imported but unused ./getrusage.py:6: 'SIGTERM' imported but unusedのように警告を出してくれる
packageというよりはプロセス死活監視ツール。http://supervisord.org/ たぶんdaemontoolsのようなタイプだと思う。
postgres connector。これがメジャーかどうかわからん。http://initd.org/psycopg/
項目 | 値 |
---|---|
DB | testdb |
USER | postgres |
PASS | なし(ほんまは設定しとくべきだが、試しなんで) |
HOST | localhost |
PORT | 5432 |
createdb -E UTF-8 -U postgres testdb
section
member
SQL
field | type | other |
---|---|---|
section_id | serial | primary key |
section_name | varchar(128) | not null |
member
field | type | other |
---|---|---|
member_id | serial | primary key |
first_name | varchar(128) | not null |
last_name | varchar(128) | not null |
age | int | not null |
section_id | int | not null references section (section_id) on delete restrict |
SQL
create table section ( section_id serial primary key, section_name varchar(128) not null ); create table member ( member_id serial primary key, first_name varchar(128) not null, last_name varchar(128) not null, age int not null, section_id int not null references section (section_id) on delete restrict ); insert into section(section_name) values('developer'); insert into section(section_name) values('operation'); insert into section(section_name) values('marketing'); insert into section(section_name) values('management'); insert into member(first_name, last_name, age, section_id) values('kurt', 'cobain', 27, 1); insert into member(first_name, last_name, age, section_id) values('king', 'buzzo', 43, 2); insert into member(first_name, last_name, age, section_id) values('akiko', ' ', 31, 3); # 確認 select m.member_id, trim(m.first_name || ' ' || m.last_name) as member_name, m.age, s.section_name from member as m left join section as s on m.section_id = s.section_id; member_id | member_name | age | section_name -----------+-------------+-----+-------------- 1 | kurt cobain | 27 | developer 2 | king buzzo | 43 | operation 3 | akiko | 31 | marketing (3 行)
#!/usr/bin/python # vim: fileencoding=utf-8 expandtab import psycopg2 import psycopg2.errorcodes as errorcodes try: conn = psycopg2.connect(database="testdb", user="postgres", password="", host="localhost", port=5432) except Exception, e: print("DB connection error") print(e) else: try: try: cur = conn.cursor() sql = "select section_id, section_name from section" cur.execute(sql) for record in cur: print(record) cur.close() except Exception, e: print(e.pgerror) print(e.pgcode) print(errorcodes.lookup(e.pgcode)) finally: conn.close()結果は
(1, 'developer') (2, 'operation') (3, 'marketing') (4, 'management')
#!/usr/bin/python # vim: fileencoding=utf-8 expandtab import psycopg2 import psycopg2.errorcodes as errorcodes try: conn = psycopg2.connect(database="testdb", user="postgres", password="", host="localhost", port=5432) except Exception, e: print("DB connection error") print(e) else: try: try: cur = conn.cursor() sql = "insert into member (first_name, last_name, age, section_id) values (%s, %s, %s, %s)" cur.execute(sql, ("foo", "bar", 56, 4)) conn.commit() print("rowcount: %d" % (cur.rowcount)) print("rownumber: %d" % (cur.rownumber)) print("lastrowid: %d" % (cur.lastrowid)) cur.close() except Exception, e: print(e.pgerror) print(e.pgcode) print(errorcodes.lookup(e.pgcode)) finally: conn.close()place holderは
sql = "insert into member (first_name, last_name, age, section_id) values (%(first_name)s, %(last_name)s, %(age)s, %(section_id)s)" cur.execute(sql, {"first_name":"foo", "last_name":"bar", "age":56, "section_id":4})に置き換えることも可
iterator or fetchallの結果をtupleからdictに変更する
import psycopg2.extras cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) sql = "select section_id, section_name from section" cur.execute(sql) for record in cur: print("section_id:%(section_id)s section_name:%(section_name)s" % record) cur.close()
set_isolation_level
# conn = psycopg2.connection import psycopg2.extensions conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED)ちなみにデフォルトは
# 1 = psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED print(conn.isolation_level)conn.commit()なしで即時反映させる場合はpsycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMITだと思う
try: cur = conn.cursor() sql = "insert into member (first_name, last_name, age, section_id) values (%s, %s, %s, %s)" records = (("foo1", "bar1", 11, 1), ("foo2", "bar2", 12, 2), ("foo3", "bar3", 81, 4)) for record in records: cur.execute(sql, record) conn.commit() cur.close() except Exception, e: conn.rollback() print(e.pgerror) print(e.pgcode) print(errorcodes.lookup(e.pgcode))perlでいうDBI::st#prepareはないのか?
↑の例ではloopでexecuteを実行しているが
try: cur = conn.cursor() sql = "insert into member (first_name, last_name, age, section_id) values (%s, %s, %s, %s)" records = (("foo1", "bar1", 11, 1), ("foo2", "bar2", 12, 2), ("foo3", "bar3", 81, 4)) cur.executemany(sql, records) conn.commit() cur.close() except Exception, e: conn.rollback() print(e.pgerror) print(e.pgcode) print(errorcodes.lookup(e.pgcode))となる
ないようだ。なので
sql1 = "insert into member (first_name, last_name, age, section_id) values (%s, %s, %s, %s)" # 対象テーブルのsequenseから最後の値をとる sql2 = "select last_value from member_member_id_seq" cur.execute(sql1, ("foo", "bar", 56, 4)) cur.execute(sql2) last_insert_id = cur.fetchone()[0]nextvalを使って、自分でserial型を更新した場合は
sql1 = "insert into member (member_id, first_name, last_name, age, section_id) values (nextval('member_member_id_seq'), %s, %s, %s, %s)" sql2 = "select currval('member_member_id_seq')" cur.execute(sql1, ("foo", "bar", 56, 4)) cur.execute(sql2) last_insert_id = cur.fetchone()[0]もはやpsycopg2のねたでもなんでもないが。ほかにいいものはないものか
fetchallとか
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) sql = "select member_id, (first_name || ' ' || last_name) as member_name from member" cur.execute(sql) records = cur.fetchall() for record in records: print("member_id:%(member_id)s member_name:%(member_name)s" % record) cur.close()fetchone, fetchmanyなどがある
タグ
最新コメント