2

次のコマンドでモデルを使用するコマンドラインでスクリプトを実行しようとしています。

c:\web2py>python web2py.py -M -N -S automate -R applications/automate/modules/eventserver.py

しかし、私はエラーを受け取り続けます:

web2py Web Framework
Created by Massimo Di Pierro, Copyright 2007-2011
Version 1.99.7 (2012-03-04 22:12:08) stable
Database drivers available: SQLite3, pymysql, pg8000, IMAP
Traceback (most recent call last):
  File "c:\web2py\gluon\shell.py", line 206, in run
    execfile(startfile, _env)
  File "applications/automate/modules/eventserver.py", line 6, in <module>
    deviceHandler = devicehandler.DeviceHandler()
  File "applications\automate\modules\devicehandler.py", line 10, in __init__
    self.devices = self.getActiveDevices()
 File "applications\automate\modules\devicehandler.py", line 18, in getActiveDe
vices
    print db
NameError: global name 'db' is not defined

私は何が間違っているのですか?

編集:私の調査から、「コマンドに-Mを追加する」という解決策しか見つかりませんでしたが、すでにそれを実行しましたが、それでも機能しません。

edit2:db.pyにdb = DAL('sqlite://storage.sqlite')があるので、ロードする必要があります

4

1 に答える 1

8

edit2:db.pyにdb = DAL('sqlite://storage.sqlite')があるので、ロードする必要があります

db.pyが/modelsフォルダーにdbあるとすると、そこで作成されたオブジェクトは、後で実行されるモデルファイル、およびコントローラーとビューで使用できますが、インポートしたモジュール内では使用できません。代わりに、dbオブジェクトをモジュール内の関数またはクラスに渡す必要があります。もう1つのオプションは、dbオブジェクトをcurrentスレッドローカルオブジェクトに追加することです。このオブジェクトは、モジュール内でインポートしてアクセスできます。

/models/db.py内:

from gluon import current
db = DAL('sqlite://storage.sqlite')
current.db = db

/modules/eventserver.py:

from gluon import current
def somefunction():
    db = current.db
    [do something with db]

モジュールでオブジェクトを定義dbする場合は、トップレベルで定義しないでください。関数またはクラスで定義してください。

詳細については、モジュールとcurrentの本のセクションを参照してください。

于 2012-08-15T02:38:17.823 に答える