db initの実行中にレコードをテーブルに追加する


8

私のアプリケーションでは、フラスコ、sqlalchemy、sqlite、およびpythonを使用しています。データベースを作成するためにdb initを実行するとき、デフォルトの値のセットをデータベースに追加する必要があります。レコードをテーブルに追加するためにこれら2つのことを試しました。1つの方法は「イベント」を使用することです。

from sqlalchemy.event import listen
from sqlalchemy import event, DDL

@event.listens_for(studentStatus.__table__, 'after_create')
def insert_initial_values(*args, **kwargs):
    db.session.add(studentStatus(status_name='Waiting on admission'))
    db.session.add(studentStatus(status_name='Waiting on student'))
    db.session.add(studentStatus(status_name='Interaction Initiated'))
    db.session.commit()

私が走るとき

python manage_db.py db init,
python manage_db.py db migrate,
python manage_db.py db upgrade

問題はありませんでしたが、レコードが作成されていません。

私が試した別の方法は、私が含めたmodels.pyです

record_for_student_status = studentStatus(status_name="Waiting on student")
db.session.add(record_for_student_status)
db.session.commit()
print(record_for_student_status)

クラスモデルコード:

class StudentStatus(db.Model): 
   status_id = db.Column(db.Integer,primary_key=True) 
   status_name = db.Column(db.String) 
   def __repr__(self): 
      return f"studentStatus('{self.status_id}','{self.status_name}')" 

python manage_db.py db initを実行すると、エラーStudent_statusが発生します。そのようなテーブルはありません。

db initを実行するときに、student_statusテーブルにデフォルト値を追加する方法を教えてくれる人はいますか?

フラスコシーダーも試しました。フラスコシーダーをインストールし、seeds.pyという新しいファイルを1つ追加して、フラスコシードを実行しました

私のseeds.pyはこのようになります

class studentStatus(db.Model):
  def __init__(self, status_id=None, status_name=None):
    self.status_id = db.Column(db.Integer,primary_key=True)
    self.status_name = db.Column(db.String,status_name) 

  def __str__(self):
    return "ID=%d, Name=%s" % (self.status_id, self.status_name)



class DemoSeeder(Seeder):

  # run() will be called by Flask-Seeder
  def run(self):
    # Create a new Faker and tell it how to create User objects
    faker = Faker(
      cls=studentStatus,
      init={
        "status_id": 1,
        "name": "Waiting on Admission"

      }
    )

    # Create 5 users
    for user in faker.create(5):
      print("Adding user: %s" % user)
      self.db.session.add(user)

私はdb init、db migrate、db upgradeを実行しました。問題はありませんでした。フラスコのシードを実行すると、このエラーが発生します

Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory

私はそれをググって、FLASK_APP = seeds.pyをエクスポートしようとしました

Then I ran the flask seed run ,I am getting an error ``` error could not import seeds.py```
Please help me in this.
What I need finally is when I do db initialization for the first time some default value have to be added to the database.

回答:


1

フラスコアプリケーションを実行する前に、FLASK_APPおよびFLASK_ENVをインスタンス化する必要があります。

まず、データを追加するための関数を作成します。関数名があなたのように実行されていると仮定し、

def run(self):
    # Create a new Faker and tell it how to create User objects
    faker = Faker(
      cls=studentStatus,
      init={
        "status_id": 1,
        "name": "Waiting on Admission"

      }
    )

    # Create 5 users
    for user in faker.create(5):
      print("Adding user: %s" % user)
      self.db.session.add(user)

これで、アプリ実行ファイルでこの関数を呼び出すことができます。私のファイルの名前がapp.pyであるとします。

from application import app
if __name__ == '__main__':
     run()
     app.run(debug=True)

次のようにFLASK_APPとFLASK_ENVを設定します。

export FLASK_APP=app.py
export FLASK_ENV=development

その後、以下のコマンドを実行できます。

flask db init
flask db  migrate
flask db upgrade

これにより、必要なすべてのテーブルとデータが作成されます。

詳細については、以下のリンクから入手できます。このリンクはGithubリポジトリ用です。そこで、アプリの起動時にいくつかのデータを追加しました。readme.MDを読むだけで、FLASK_APPの設定に関する洞察をさらに得ることができます。

DBインスタンス化時のFlaskデータの追加


こんにちはTheeshです。Flask_envとFlask_appを追加してから、initとmigrationの実行を開始します。エラーは発生していません。フラスコシードランも実行してみましたが、今はエラーになりません。しかし、データはデータベースに挿入されていません。
グルクリシュナ

こんにちはグルクリシュナ、コードを今すぐ確認できますか?
Theesh

0

うーん、あなたがアンダースコアを入れたように見えますStudent_status、それを削除してみてください。そして他のことは、CamelCaseでクラスを書き込もうとすることです。コードを書くためのより「Pythonic」な方法です。実行すると、SQLalchemyはこのクラス名を自動的にstudent_statusテーブルに変換します。


こんにちはCaio Filus、私はあなたが言及したすべての変更を試みました。しかし、同じエラーが発生します。
グルクリシュナ

あなたはあなたにモデルコードを示すことができますか?
Caio Filus

はいモデルコードはクラスstudentStatus(db.Model)です: "ステータスリストを保存します" status_id = db.Column(db.Integer、primary_key = True)status_name = db.Column(db.String)def __repr __(self):return f "studentStatus( '{self.status_id}'、 '{self.status_name}')"
グルクリシュナ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.