繁体   English   中英

用Flask-SQLAlchemy初始化dB(sqlite3)

[英]Initialize dB(sqlite3) with Flask-SQLAlchemy

我需要为测试目的创建一个dB,并且我想向“某些”用户初始化它。

“预期”代码是:

import os
from flask import Flask
from flask.ext.script import Manager, Shell
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)

manager = Manager(app)
db = SQLAlchemy(app)

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), unique = True)
    email = db.Column(db.String(64), unique = True)

    def __init__(self, user = None, email = None):
        name = self.__tablename__
        db.drop_all()
        db.create_all()
        for i in range(100):
            user = User('user%d' % i, 'someone@example.com')
            db.session.add(user)
        db.session.commit()

    def __repr__(self):
    return '<User %r>' % self.name

调用usr_db = User()生成RuntimeError: maximum recursion depth exceeded

问题是,在构造期间,该类“准备好”以递归方式调用以避免上述错误。

我认为在模型类内部创建测试用户是错误的方法。 这将递归调用__init__()如果你实例化一个User()内的实例__init__() 更好的地方是在unittest setUp()方法内部。

但是,如果您确实要执行此操作,则可以避免多次实例化用户,如下所示:

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), unique = True)
    email = db.Column(db.String(64), unique = True)

    _test_users_initialised = False

    def _initialise_test_users(self):
        if self._test_users_initialised:
            return
        self.__class__._test_users_initialised = True

        for i in range(100):
            user = User('user%d' % i, 'someone@example.com')
            db.session.add(user)

    def __init__(self, user = None, email = None):
        name = self.__tablename__
        db.drop_all()
        db.create_all()
        self._initialise_test_users()
        db.session.commit()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM