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.