我设置了许多模型共享的数据库实例:
Database.py:
<a href="https://linksredirect.com/?pub_id=34956CL31530&url=https://www.amazon.in/b/ref=makeupfest?node=13827772031" >
<img src="https://dealsapply.com/wp-content/uploads/2018/07/amazon-copy.jpg" border="0" width="336" height="280" onclick="ga('send','event','amazon','click',6);">
</a>
从我的主from flask_sqlalchemy import SQLAlchemy
from models.shared import load_db
def init_db(app):
db = SQLAlchemy(app)
load_db(db)
from models.user import User
from models.another_model import AnotherModel
from ...
文件中的init_db
调用 create_app
。
Shared.py:
server.py
User.py:
db = None
def load_db(_db):
db = _db
print(db)
从主文件中的from .shared import db
print("User model defined.")
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(15), unique=True, nullable=False)
hash = db.Column(db.String(32), nullable=False)
email = db.Column(db.String(100), unique=True, nullable=False)
def __repr__(self):
return '<User %r>' % self.username
方法调用init_db
时,我得到:
create_app
为什么会出现此错误?从AttributeError: 'NoneType' object has no attribute 'Model'
内部导入模型模块时,我调用init_db
之后不应该运行它们的代码吗?在任何模型使用打印语句之前,先明确查看打印语句load_db
的顺序:
db
答案 0 :(得分:2)
在
def load_db(_db):
db = _db
print(db)
您实际上是在函数db
的局部声明变量load_db
。
要实际引用全局db
变量,请尝试global db
表达式:
def load_db(_db):
global db
db = _db
print(db)
尽管如此,我发现这段代码很不完整,我会考虑使用单调或其他方法。
请考虑在初始化之前先导入db
之前的情况。喜欢:
from .shared import db
save_for_later_use(db)
即使您替换了db
模块中的shared
,shared.db
也将指向初始化值,而您将拥有已存储在{中的变量所指向的未初始化值{1}}。
换句话说,您已经重复了save_for_later_use
指向的内容,但是无论在初始化之前试图记住shared.db
的任何代码仍将保留指向shared.db
的指针。