预先填充Flask SQLAlchemy数据库

时间:2019-05-09 16:02:34

标签: python flask flask-sqlalchemy

我有两个模型,一个是Identification,其中包含两个ID(first_id和second_id),第二个是User。这个想法是,只有授权用户才能获得其first_id和second_id对值。他们进入该站点并通过输入两个ID加上用户名和密码(然后在此生成)来登录。

我正在尝试在这里实现两件事:

  1. 使用许多(假设为100个)first_id / second_id值预填充“标识”表,这些值将用作登录的正确值对。

  2. 以这样的方式设置User类,即只有用户在登录表单中输入正确的first_id / second_id对时,他们才能登录(假定这涉及以某种方式使用Identification表检查表单数据)。

这是模型类:

class Identification(db.Model):

id = db.Column(db.Integer, primary_key=True)
first_id= db.Column(db.Text, unique=True)
second_id= db.Column(db.Text, unique=True)

def __init__(self, first_id, second_id):
    self.first_id= first_id
    self.second_id= second_id

def __repr__(self):
    return f"ID: {self.id}, first_id: {self.first_id}, second_id: {self.second_id}"



class User(db.Model, UserMixin):

__tablename__ = 'user'

first_id= db.relationship('Identification', backref = 'identificationFID', uselist=False)
second_id = db.relationship('Identification', backref = 'identificationSID', uselist=False)
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.Text, unique=True, index=True)
password_hash = db.Column(db.Text(128))
identification_id = db.Column(db.Integer, db.ForeignKey('identification.id'), unique=True)
first_id = db.Column(db.Text, unique=True)
second_id = db.Column(db.Text, unique=True)

我很乐意为此提供帮助,这确实超出了我对python / Flask的理解。谢谢大家!

2 个答案:

答案 0 :(得分:1)

上面的答案对我不起作用,因为 create_tables() 函数作为 User 类的一部分,要求我传递该类的实例。 我想出的解决方案是在 db.create_all() 之后调用该函数。由于 @app.before_first_request 装饰器,这似乎是调用的好地方。

init.py

@app.before_first_request
def create_tables():
    """Create Tables and populate certain ones"""
    db.create_all()
    from app.models.init_defaults import init_defaults
    init_defaults()

init_defaults.py

def init_defaults():
"""Pre-Populate Role Table"""
if Role.query.first() is None:
    roles = ['Admin', 'Master', 'Apprentice']
    for role in roles:
        user_role = Role(access_level=role)
        if role != 'Apprentice':
            user_role.set_password('Passw0rd!')
        db.session.add(user_role)
    db.session.commit()
pass

由于装饰器,该函数现在每个实例只调用一次。我可以想象的另一个解决方案是使用事件: https://dzone.com/articles/how-to-initialize-database-with-default-values-in

注意:这是一个不适合生产的开发解决方案。

答案 1 :(得分:0)

您可以使用模拟数据填充这些表。 在这个py文件中创建一个函数,您可以在其中使用ORM将对象添加到数据库 然后在__init__.py中调用该函数,一旦烧瓶服务器启动,该函数就会填充数据。

更新:-

这是供您参考的代码。

Model.py

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

Base = declarative_base()
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)
session = Session()

class User(Base):
     \__tablename__ = 'users'
     id = Column(Integer, primary_key=True)
     name = Column(String)
     fullname = Column(String)

     #Create getter setters

    def create_tables():
        Base.metadata.create_all(engine)
        user = User()
        user.id=1
        user.name="ABC"
        user.fullname="ABCDEF"
        session.add(user)
        # similarly create more user objects with mock data and add it using session

__ init __。py

from model import User
User.create_tables()

Reference