NoneType没有属性(导入混乱)

时间:2018-07-31 11:36:08

标签: python database flask flask-sqlalchemy python-import

我设置了许多模型共享的数据库实例:

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

1 个答案:

答案 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模块中的sharedshared.db也将指向初始化值,而您将拥有已存储在{中的变量所指向的未初始化值{1}}。 换句话说,您已经重复了save_for_later_use指向的内容,但是无论在初始化之前试图记住shared.db的任何代码仍将保留指向shared.db的指针。