私はフラスコ、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テーブルにデフォルト値を追加する方法を教えてくれる人はいますか?
フラスコシーダーも試しました。 flask seederをインストールし、seeds.pyという新しいファイルを1つ追加して、flask seed runを実行しました
私の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を実行しました。問題はありませんでした。私が実行したときflaskシード実行すると、このエラーが発生します
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.
flaskアプリケーションを実行する前に、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の設定に関する洞察をさらに得ることができます。
うーん、アンダースコアをStudent_status
、それを削除してみてください。そして、他のことは、CamelCaseでクラスを書き込もうとすることです。コードを書くための「Python的」な方法です。実行すると、SQLalchemyはこのクラス名を自動的にstudent_statusテーブルに変換します。