1

web2py でデータベースにテーブルを作成しようとしています。私はこれが初めてで、MVC構造とその間の呼び出し方法を把握しようとしています。私が行ったことは /modles/db.py にあります。DBを作成しました:

TestDB = DAL("sqlite://storage.sqlite")

次に、 /controllers/default.py に次のものがあります。

def index():
    form = FORM(INPUT(_name='name', requires=IS_NOT_EMPTY()),
              INPUT(_type='submit'))

    if form.process().accepted:
        TestDB().define_table(form.vars.name, Field('testField', unique=True))
        return dict(form=form)

    return dict(form=form)

しかし、これは機能していません。誰かがこれを達成する方法を理解するのを手伝ってくれますか?

ありがとうございました。

4

1 に答える 1

2

まず、テーブルを定義するには、TestDB.define_table(...)ではなくになりTestDB().define_table(...)ます。

第 2 に、テーブル定義はリクエスト間で保持されません (もちろん、データベース テーブル自体は保持されますが、DAL テーブル定義は保持されません)。そのため、関数内でテーブルを定義するindex()と、それが存在し、アプリでアクセスできる唯一の場所になります。アプリの他の場所にあるテーブルにアクセスする場合は、テーブル定義に関するメタデータ (この場合はテーブル名のみ) をデータベースまたはファイルなどのどこかに保存する必要があります。次に、各リクエストでその情報を取得し (おそらく、処理を高速化するためにキャッシュします)、それを使用してテーブル定義を作成します。

もう 1 つのオプションは、テーブル定義コードを生成し、それをモデル ファイルに追加して、要求ごとに自動的に実行されるようにすることです。これは、新しいアプリケーションを生成するときに「admin」アプリの新しいアプリケーション ウィザードがどのように機能するかを大まかに示したものです。

最後に、テーブル定義をそのままindex()関数に残すことができ、各リクエストでデータベース接続を作成するときに、次を使用できますauto_import

TestDB = DAL("sqlite://storage.sqlite", auto_import=True)

これにより、アプリケーションの /databases/*.table ファイルに格納されているメタデータに基づいて、TestDB 内のすべてのテーブルのテーブル定義が自動的に作成されます。メタデータには、テーブル名、フィールド名、フィールド タイプなどのデータベース固有のメタデータのみが含まれることに注意してください。バリデータ、デフォルト値、計算関数などの web2py 固有の属性は含まれません。したがって、このオプションは制限されています。使いやすさ。

もちろん、これにはすべてセキュリティ上の意味があります。ユーザーにテーブルとフィールドの定義を許可すると、特定の送信によって既存のデータベース テーブルが誤ってまたは悪意を持って変更される可能性があります。そのため、ユーザーの送信を処理する前に、いくつかの注意深いチェックを行う必要があります。

于 2012-04-25T14:55:32.320 に答える