Twisted adbapi:Twistedリレーショナル・データベースのサポート

3518 ワード

【概要】
Twistedは非同期ネットワークフレームワークであり、残念ながらほとんどのデータベースapiはブロックインタフェースのみを実現し、twisted.enterprise.adbapiはこのために生成され、DB−API 2.0 APIの非ブロックインタフェースであり、様々な関係データベースにアクセスすることができる.
あなたが知っているとします.
    Python :-)
簡単なTwisted Serverを書く方法(tutorialを参照)
データベースに詳しい関連インタフェース(DBAPI 2.0参照)
【概要】
Twistedは非同期ネットワークフレームワークであり、通常はインタフェースを使用するため、標準データベースモジュールが直接使用できないことを意味します.
#     ...
db = dbmodule.connect('mydb', 'andrew', 'password')
# ...which blocks for an unknown amount of time

#     
cursor = db.cursor()

#     ...
resultset = cursor.query('SELECT * FROM table WHERE ...')
# ...         ,     

非同期フレームワークでは、これらの遅延は受け入れられません.そのため、Twistedはtwistedを提供した.enterprise.adbapiは、DB-API 2.0プロトコルの非同期パッケージに従う.
adbapiは単独のスレッドでデータベースをブロックする操作を行い、操作が完了したときもこのスレッドでコールバックを行う.同僚、元のスレッドは正常な仕事を続けることができて、他の要求にサービスします.
【adbapiの使い方?】
データベース接続を直接作成するのではなくadbapiを使用します.ConnectionPoolクラスは接続を管理する.これによりadbapiは、スレッドごとに1つの接続など、複数の接続を使用することができます.これは簡単です.
#前の例の「dbmodule」を使用してConnectionPoolオブジェクトを作成
from twisted.enterprise import adbapi
dbpool = adbapi.ConnectionPool("dbmodule", 'mydb', 'andrew', 'password')
注意事項:
dbmoduleを直接インポートする必要はありません.adbapiに伝えるだけだConnectionPoolコンストラクタMysqlDbなどのデータベースモジュールの名前を使用します.
dbmoduleに伝える必要がありますconnect()のパラメータは同じadbapiに渡される.ConnectionPoolコンストラクタ.
データベース・クエリーを実行できます.
#     cursor.execute(statement), return cursor.fetchall():
def getAge(user):
    return dbpool.runQuery("SELECT age FROM users WHERE name = ?", user)

def printResult(l):
    if l:
        print l[0][0], "years old"
    else:
        print "No such user"

getAge("joe").addCallback(printResult)

これは非常に直接的であり、もちろんgetAgeの戻り値を除く.データベース操作が本当に完了したときにコールバックするDeferred遅延オブジェクトを返す可能性があります.
runQueryのほかにrunOperationとrunInteractionがあり、それらを呼び出すとfunctionが付きます.このfunctionはスレッドでadbapiを通過します.Transactionが実行し、本質的にはDB-API cursorを模倣する.いずれの場合も、データベース・トランザクションは、例外が発生してロールバックが必要でない限り、操作が完了したときにコミットされます.
def _getAge(txn, user):
    # this will run in a thread, we can use blocking calls
    txn.execute("SELECT * FROM foo")
    # ... other cursor commands called on txn ...
    txn.execute("SELECT age FROM users WHERE name = ?", user)
    result = txn.fetchall()
    if result:
        return result[0][0]
    else:
        return None

def getAge(user):
    return dbpool.runInteraction(_getAge, user)

def printResult(age):
    if age != None:
        print age, "years old"
    else:
        print "No such user"

getAge("joe").addCallback(printResult)

また、これらの例でdbmoduleが「qmarks」式のパラメータを使用していると仮定します(DB-API仕様を参照).dbmoduleが異なるパラメータモード(e.g.pyformat)を使用している場合は、使用すればいいです.Twistedはすべてのタイプの魔法パラメータ-runQuery(query,params,...)を提供していません.cursorに直接マッピングされます.execute(query, params, ...).
次に、各データベースの適合例を示します.
最初のパラメータはデータベースのモジュール名で、通常はimportとconnect(...)ができます.残りのパラメータもconnect(…)方法に必要なもの.
from twisted.enterprise import adbapi

# Gadfly
cp = adbapi.ConnectionPool("gadfly", "test", "/tmp/gadflyDB")

# PostgreSQL PyPgSQL
cp = adbapi.ConnectionPool("pyPgSQL.PgSQL", database="test")

# MySQL
cp = adbapi.ConnectionPool("MySQLdb", db="test")

これまでtwistedでデータベースを使用する方法を知っていました.adbapiモジュールのドキュメントをさらに読んで、他の機能と方法を理解する必要があるかもしれません.この文章が明るい道を示してくれることを望んでいます.