Adicionando registros à tabela enquanto executa o db init


8

Estou usando o balão, sqlalchemy, sqlite e python para o meu aplicativo. Quando executo o db init para criar o banco de dados, quero que um conjunto padrão de valores seja adicionado ao banco de dados. Eu tentei essas duas coisas para adicionar os registros à tabela. Um método está usando 'evento'.

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()

Quando eu corro

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

Não recebi nenhum problema, mas os registros não estão sendo criados.

O outro método que tentei é, nos models.py, que incluí

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)

O código do modelo de classe:

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}')" 

Quando executo python manage_db.py db init, estou recebendo um erro Student_status, não existe essa tabela.

Alguém pode me ajudar como adicionar os valores padrão à tabela student_status quando executo o db init?

Eu tentei com o semeador de frascos também. Eu instalei o semeador de balões e adicionei um novo arquivo chamado seeds.py e executei a corrida de sementes do balão

Meu seeds.py fica assim

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)

Corri db init, db migrate e db upgrade. Eu não tive nenhum problema. Quando executei o teste de semente do balão, estou recebendo este erro

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

Pesquisei no Google e tentei exportar 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.

Respostas:


1

Antes de executar o aplicativo de balão, você deve instanciar o FLASK_APP e o FLASK_ENV.

Primeiro Crie uma função para adicionar dados. suponha que o nome da função seja executado como o seu,

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)

Agora você pode chamar essa função no arquivo em execução do aplicativo. Suponha que meu arquivo tenha nomeado como app.py.

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

Agora defina o FLASK_APP e o FLASK_ENV como abaixo.

export FLASK_APP=app.py
export FLASK_ENV=development

Depois disso, você pode executar os comandos abaixo.

flask db init
flask db  migrate
flask db upgrade

isso criará todas as tabelas e dados que você deseja.

Para mais detalhes, você pode obter no link abaixo. Este link é para um repositório do Github. Lá, adicionei alguns dados ao iniciar o aplicativo. Basta ler o readme.MD para obter mais informações sobre a configuração do FLASK_APP.

Adição de dados do balão ao instanciar o banco de dados


Olá Theesh, adicionei o Flask_env e o flask_app e, em seguida, começo a executar o init e a migração. Não estou recebendo nenhum erro. Tentei também executar a semente do balão, não estou recebendo nenhum erro agora. Mas os dados não estão sendo inseridos no banco de dados.
— Guru Krishna

Olá Guru Krishna, posso ver seu código agora?
— Theesh

0

humm, parece que você colocou um sublinhado Student_status, tente removê-lo. E outra coisa, tente escrever sua classe no CamelCase, é uma maneira mais "Pythonic" de escrever um código; quando você o executa, o SQLalchemy transformará esse nome de classe na tabela student_status automaticamente


Olá Caio Filus, Eu tentei todas as alterações que você mencionou. Mas estou recebendo o mesmo erro.
— Guru Krishna

você pode mostrar o código do modelo?
— Caio Filus 03/02

Sim Meu código de modelo é a classe studentStatus (db.Model): "Salvar a lista de status" 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}')"
— Guru Krishna em
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.