使用 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
。
问题是,在构建过程中,class 已“准备好”递归调用以避免上述错误。
我认为在模型中创建测试用户 class 是错误的做法。如果您在 __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()
我需要创建一个 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
。
问题是,在构建过程中,class 已“准备好”递归调用以避免上述错误。
我认为在模型中创建测试用户 class 是错误的做法。如果您在 __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()