Добавление записей в таблицу при запуске init db - PullRequest
8 голосов
/ 03 февраля 2020

Я использую flask, sqlalchemy, sqlite и python для моего приложения. Когда я запускаю db init для создания базы данных, я хочу, чтобы в базу данных был добавлен некоторый набор значений по умолчанию. Я попробовал эти две вещи, чтобы добавить записи в таблицу. Один метод использует 'event'.

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, такой таблицы нет.

Может кто-нибудь помочь мне, как добавить значения по умолчанию в таблицу student_status, когда я запускаю db init?

Я пробовал с flask также Я установил flask seeder и добавил один новый файл под названием seed.py, и я запустил flask seed seed

Мой seed.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 инициализация, перенос базы данных и обновление базы данных. Я не получил никаких проблем. Когда я запускаю flask seed run, я получаю эту ошибку

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 = seed.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.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Перед запуском приложения 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.

Flask Добавление данных при создании экземпляра БД

0 голосов
/ 03 февраля 2020

хм, похоже, что вы поставили подчеркивание в Student_status, попробуйте удалить его. И еще, попробуйте написать свой класс в CamelCase, это более "Pythoni c" способ написания кода, при запуске SQLalchemy автоматически преобразует это имя класса в таблицу student_status

...