【问题标题】:Adding records into table while running the db init在运行 db init 时将记录添加到表中
【发布时间】:2020-05-19 05:34:50
【问题描述】:

我正在为我的应用程序使用烧瓶、sqlalchemy、sqlite 和 python。当我运行 db init 来创建数据库时,我希望将一些默认值集添加到数据库中。我已经尝试了这两件事来将记录添加到表中。一种方法是使用“事件”。

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 表中吗?

我也尝试过使用烧瓶播种机。我已经安装了烧瓶播种器并添加了一个名为 seed.py 的新文件,然后我运行了烧瓶种子运行

我的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.

【问题讨论】:

    标签: python-3.x sqlite flask sqlalchemy flask-sqlalchemy


    【解决方案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 的更多信息。

    Flask Data Adding when DB instantiating

    【讨论】:

    • 嗨 Theesh,我已经添加了 Flask_env 和 flask_app,然后我开始运行初始化和迁移。我没有收到任何错误。我也尝试运行烧瓶种子运行,我现在没有收到任何错误。但是数据没有被插入到数据库中。
    【解决方案2】:

    嗯,好像你在Student_status 中加了一个下划线,试试把它去掉。还有一点,尝试用 CamelCase 编写你的类,这是一种更“Pythonic”的代码编写方式,当你运行它时,SQLalchemy 会自动将这个类名转换为 student_status 表

    【讨论】:

    • 嗨 Caio Filus,我已经尝试了您提到的所有更改。但我遇到了同样的错误。
    • 是我的模型代码是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}')"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2022-12-17
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2014-05-24
    相关资源
    最近更新 更多