Twisted adbapi:Twistedリレーショナル・データベースのサポート
3518 ワード
【概要】
Twistedは非同期ネットワークフレームワークであり、残念ながらほとんどのデータベースapiはブロックインタフェースのみを実現し、twisted.enterprise.adbapiはこのために生成され、DB−API 2.0 APIの非ブロックインタフェースであり、様々な関係データベースにアクセスすることができる.
あなたが知っているとします.
Python :-)
簡単なTwisted Serverを書く方法(tutorialを参照)
データベースに詳しい関連インタフェース(DBAPI 2.0参照)
【概要】
Twistedは非同期ネットワークフレームワークであり、通常はインタフェースを使用するため、標準データベースモジュールが直接使用できないことを意味します.
非同期フレームワークでは、これらの遅延は受け入れられません.そのため、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コンストラクタ.
データベース・クエリーを実行できます.
これは非常に直接的であり、もちろんgetAgeの戻り値を除く.データベース操作が本当に完了したときにコールバックするDeferred遅延オブジェクトを返す可能性があります.
runQueryのほかにrunOperationとrunInteractionがあり、それらを呼び出すとfunctionが付きます.このfunctionはスレッドでadbapiを通過します.Transactionが実行し、本質的にはDB-API cursorを模倣する.いずれの場合も、データベース・トランザクションは、例外が発生してロールバックが必要でない限り、操作が完了したときにコミットされます.
また、これらの例でdbmoduleが「qmarks」式のパラメータを使用していると仮定します(DB-API仕様を参照).dbmoduleが異なるパラメータモード(e.g.pyformat)を使用している場合は、使用すればいいです.Twistedはすべてのタイプの魔法パラメータ-runQuery(query,params,...)を提供していません.cursorに直接マッピングされます.execute(query, params, ...).
次に、各データベースの適合例を示します.
最初のパラメータはデータベースのモジュール名で、通常はimportとconnect(...)ができます.残りのパラメータもconnect(…)方法に必要なもの.
これまでtwistedでデータベースを使用する方法を知っていました.adbapiモジュールのドキュメントをさらに読んで、他の機能と方法を理解する必要があるかもしれません.この文章が明るい道を示してくれることを望んでいます.
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モジュールのドキュメントをさらに読んで、他の機能と方法を理解する必要があるかもしれません.この文章が明るい道を示してくれることを望んでいます.