取得している理由OperationalError: database is locked
は、2 つのdev_appserver.py
インスタンスが同じデータベースのローカル ストレージ ディレクトリにアクセスしようとして衝突するためです。デフォルトでは、アプリの名前に基づいて決定されます。同じアプリの 2 つのサービスと同じです。
このような衝突を回避する 1 つの方法は、 dev_appserver.py
の--storage_path
オプションの引数を使用して、ローカル ストレージ ディレクトリも指定することです (これは で確認できますdev_appserver.py --help
)。
--storage_path PATH path to the data (datastore, blobstore, etc.)
associated with the application. (default: None)
ただし、2 つの異なるストレージ パスを使用すると、予期しない結果が生じる可能性があります。サービスがそのストレージ内の同じ情報を参照する場合、異なる値が表示される可能性があります。
同じアプリの複数のサービスを使用する適切な方法はdev_appserver.py
、単一のdev_appserver.py
インスタンスを介してすべてのサービスを実行することです。これにより、各サービスに異なるポートが割り当てられます。
たとえば、3 つのサービスがあり、ディスパッチ ファイルを使用するアプリがあります。これは、3 つのサービス ディレクトリの親ディレクトリであるアプリ ディレクトリから開発サーバーを呼び出す方法です (ディスパッチ ファイルは、.yaml
ファイル引数のリストの最初のファイルである必要があり、常にデフォルト モジュールのファイルが続きます。ケースmain/main.yaml
):
/usr/bin/python2.7 /usr/local/google_appengine/dev_appserver.py --host 0.0.0.0 --log_level=debug dispatch.yaml main/main.yaml buildin/buildin.yaml apartci/apartci.yaml
これは、サーバーの起動時に表示される、各サービスがリッスンするポートを devserver が自動的に割り当てる方法です。
INFO 2016-11-18 14:20:53,329 api_server.py:205] Starting API server at: http://localhost:40310
INFO 2016-11-18 14:20:53,330 dispatcher.py:185] Starting dispatcher running at: http://0.0.0.0:8080
INFO 2016-11-18 14:20:53,345 dispatcher.py:197] Starting module "default" running at: http://0.0.0.0:8081
INFO 2016-11-18 14:20:53,353 dispatcher.py:197] Starting module "buildin" running at: http://0.0.0.0:8082
INFO 2016-11-18 14:20:53,361 dispatcher.py:197] Starting module "apartci" running at: http://0.0.0.0:8083
INFO 2016-11-18 14:20:53,362 admin_server.py:116] Starting admin server at: http://localhost:8000