1

Pyramid アプリケーションに接続されたデータベースのエントリから Whoosh インデックスを作成したいと考えています。ただし、アプリケーションの外部でデータベースにアクセスする方法がよくわかりません。

したがって、 mymodels.pyは次のように初期化されます。

from sqlalchemy import (
    Column,
    Integer,
    Text,
    String,
    ForeignKey,
    Table
    )

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy.orm import (
    scoped_session,
    sessionmaker,
    relationship,
    backref
    )

from sqlalchemy.dialects.mysql import DATETIME, FLOAT, TEXT

from zope.sqlalchemy import ZopeTransactionExtension

db_session = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
dbBase = declarative_base()
dbBase.query = db_session.query_property()  

次に__init__.py、モデルへのロードの例を示します。

from pyramid.config import Configurator
from sqlalchemy import engine_from_config
from .models import db_session, Recipe
def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    engine = engine_from_config(settings, 'sqlalchemy.')

    db_session.configure(bind=engine)

production.iniのエンジンの割り当てがあります:

sqlalchemy.url = mysql+pymysql://username:password@localhost:3306/database?charset=utf8

そのため、.ini ファイルからエンジンを渡す WSGI プロセスの開始時に main が呼び出されます。しかし、WSGI プロセスに依存しないスクリプトを使用してデータベースにアクセスしたいと考えています。エンジンを割り当てて、スクリプト内のセッションにバインドすることはできますか? セッションにどのようにextension=ZopeTransactionExtension()影響しますか?

4

2 に答える 2

1

alchemyscaffold には、例として使用できるスクリプトが含まれていますinitializeセットアップは、私がコメントした次の例のようになります。

config_uri = argv[1]  # Get config file name from arguments
setup_logging(config_uri)  # In case you want ti use the logging config from the file
settings = get_appsettings(config_uri)  # Get a settings dir from the file
engine = engine_from_config(settings, 'sqlalchemy.')  # Setup the engine from the settings
DBSession.configure(bind=engine)  # Configure the session to use the engine
with transaction.manager:  # Do stuff in a transaction
    # Do DB stuff

これZopeTransactionExtensionは、データベースの作業をコミットする必要があることを意味するため、コードを で終了するかtransaction.commit()、または でラップしますwith transaction.manager:

于 2012-10-12T14:14:18.430 に答える
0

Pyramid のドキュメントには、スクリプトの記述を扱うセクションがありますが、コマンドライン セクションに埋もれています。関連する部分は、initializeddb.py がコンソール スクリプトに変換されていることです。これにより、binディレクトリにスクリプトが作成されます。modelsこれが、相対インポートを使用してインポートされる 理由です。

現時点では、これは私のニーズには少し不必要に思えたので、もっとシンプルなものが必要でした。解決策は、次のものを含めることでした。

if __name__ == '__main__':
    main()

production.ini私のスクリプトで、私のファイルを含むディレクトリからスクリプトを呼び出します:

../bin/python -m myproject.scripts.whooshindex production.ini 

-mモジュールをスクリプトとして実行します。これにより、相対インポートが修正され、事前定義されたinitializedb.pyスクリプトの利点がすべて利用されます。

于 2012-10-13T09:04:24.443 に答える