Python 预填充SQLAlchemy数据库

Python 预填充SQLAlchemy数据库,python,flask,flask-sqlalchemy,Python,Flask,Flask Sqlalchemy,我有两个模型,一个是包含两个id(第一个id和第二个id)的标识,第二个是用户。这个想法是,只有授权用户才能获得他们的第一个和第二个id对值。他们通过输入两个id加上用户名和密码(然后在那里生成)进入该站点并登录 我在这里试图实现两件事: 用许多(比如说100个)first_id/second_id值预先填充标识表,这些值将作为登录的正确值对 以这样的方式设置用户类:只有当用户在登录表单中输入了正确的第一个\u id/第二个\u id对时,他们才能登录(可能这涉及以某种方式使用标识表检查表单数据

我有两个模型,一个是包含两个id(第一个id和第二个id)的标识,第二个是用户。这个想法是,只有授权用户才能获得他们的第一个和第二个id对值。他们通过输入两个id加上用户名和密码(然后在那里生成)进入该站点并登录

我在这里试图实现两件事:

  • 用许多(比如说100个)first_id/second_id值预先填充标识表,这些值将作为登录的正确值对

  • 以这样的方式设置用户类:只有当用户在登录表单中输入了正确的第一个\u id/第二个\u id对时,他们才能登录(可能这涉及以某种方式使用标识表检查表单数据)

  • 以下是模型类:

    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的理解。谢谢大家

    您可以使用模拟数据填充这些表。 在这个py文件中创建一个函数,可以使用ORM将对象添加到DB中 然后调用_uinit__uuuy.py中的函数,该函数将在flask服务器启动后填充数据

    更新:-

    这里有一个代码供您参考

    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
    
    __初始值

    from model import User
    User.create_tables()
    

    上面的答案对我不起作用,因为
    create_tables()
    函数作为用户类的一部分,要求我传递该类的实例。 我提出的解决方案是在
    db.create\u all()
    之后调用函数。这似乎是一个打电话的好地方,因为
    @app.before\u first\u request
    decorator

    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
    
    由于使用了decorator,现在每个实例只调用一次函数。我可以想象的另一个解决方案是使用事件:


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

    您能简单解释一下这个函数在实践中是什么样子的吗?谢谢你的回复,我已经修改了评论。您可以检查:)我正在使用SQLite。我认为语法会有所不同,对吗?不,只是连接字符串(您声明引擎的位置)会根据您使用的数据库而改变。请确认,def create_tables()函数是否发生在用户类内部,还是堆栈溢出时缩进就是这样出现的?