TwistedからPostgreSQLに接続するゼ

| | Comments (0) | TrackBacks (0)
HDEラボの桜井です。
昨日に引き続き、Twistedネタを。

CentOSのPythonの場合、付属のドライバでPostgreSQLへ接続しようとすると、「postgresql-python」を使うことになります。
#実際は、pg.pyとpgdb.pyがインストールされます。

Twistedから使う前に、簡単にpgdb.pyの説明をしておきます。
下記はローカルホストのtestデータベースへ接続して、USERSテーブルの内容を表示する簡単なサンプルです。

import pgdb

db = pgdb.connect(database='test', host='127.0.0.1:5432', user='admin', password='password')
cursor = db.cursor()
cursor.execute("SELECT id,name,age from USERS")
while True:
  row = cursor.fetchone()
  if not row: break
  print "id=%d, name=%s, age=%d\n" % (row[0], row[1], row[2])
cursor.close()
db.close()

exit

これでコマンドライン上で結果が表示されますね。

ここからは、Twistedを使ってネットワーク越しにデータをPostgreSQLへ保存したりする場合を説明します。
その場合には、"twisted.enterprise.adbapi.ConnectionPool"を使用します。
また、データベースのドライバはpgdb.pyを使用します。
下記は、入力をデータベースへ保存する簡単なEchoサーバのサンプルです。

echo.tac
from twisted.internet.protocol import Protocol,Factory
from twisted.application import service,internet
from twisted.enterprise import adbapi

class Echo(Protocol):
  def __init__(self):
    self.db = adbapi.ConnectionPool("pgdb", database='test', host='localhost:5432', user='admin', password='password')
    self.db.connect()
  def __del__(self):
    self.db.close()
  def dataReceived(self, data):
    self.db.runOperation("INSERT INTO message_log (comment) values(?)", (data))
    self.transport.write(data)

factory = Factory()
factory.protocol = Echo

myServer = internet.TCPServer(2345, factory)
application = service.Application('Echo')
myServer.setServiceParent(application)


プログラムを動作させるためには、下記のように実行してデーモン化します。
$ twistd -oy echo.tac

ローカルホストのTCP2345番ポートにTelnetで接続して何かを入力すると、データベースへどんどん保存されていきます。

0 TrackBacks

Listed below are links to blogs that reference this entry: TwistedからPostgreSQLに接続するゼ.

TrackBack URL for this entry: http://lab.hde.co.jp/blog/mt-tb.cgi/64

Leave a comment

About this Entry

This page contains a single entry by Takeshi SAKURAI published on October 17, 2008 5:02 PM.

Twistedに挑戦(インストールするゼ) was the previous entry in this blog.

日経225のSPF対応状況(2008年10月) is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.