烧瓶:';非类型';对象没有属性';drivername';从Python终端查询表时

烧瓶:';非类型';对象没有属性';drivername';从Python终端查询表时,python,sqlite,flask,Python,Sqlite,Flask,编辑:我在config.py中添加了以下行: print(type(SECRET_KEY), SECRET_KEY) print(type(SQLALCHEMY_DATABASE_URI), SQLALCHEMY_DATABASE_URI) print(SQLALCHEMY_DATABASE_URI == "sqlite:///site.db") 然后,当我用python run.py启动flask应用程序时,我得到了输出 <class 'str'> secr

编辑:我在config.py中添加了以下行:

print(type(SECRET_KEY), SECRET_KEY)
print(type(SQLALCHEMY_DATABASE_URI), SQLALCHEMY_DATABASE_URI)
print(SQLALCHEMY_DATABASE_URI == "sqlite:///site.db") 
然后,当我用python run.py启动flask应用程序时,我得到了输出

<class 'str'> secret
<class 'str'> sqlite:///site.db
True
我得到了输出

<class 'NoneType'> None
<class 'NoneType'> None
False
我正在使用dotenv包从.env文件加载任何秘密值或数据库URI。事实上,在前端,应用程序正在工作,因为当我进行更改时,它们会被保存并呈现在页面上。但是,我希望通过表来处理表,以快速创建虚拟数据,但由于某些原因,我不这样做

__初始值 此文件是名为main

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
from main.config import Config

db = SQLAlchemy()
bcrypt = Bcrypt()
login = LoginManager()
login.login_view = 'users.login'


def create_app(config_class=Config):
    # Create app and setup config
    app = Flask(__name__)
    app.config.from_object(Config)

    # Link extensions to the app
    db.init_app(app)
    bcrypt.init_app(app)
    login.init_app(app)

    # Add route imports
    from main.users.routes import users
    from main.decks.routes import decks
    from main.cards.routes import cards
    from main.errors.handlers import errors

    # Register blueprints
    app.register_blueprint(users)
    app.register_blueprint(decks)
    app.register_blueprint(cards)
    app.register_blueprint(errors)

    return app
config.py 环境署署长 这就是我试图从python终端与表交互的方式

>> from main import db, create_app
>> from main.models import Card
>> app = create_app()
>> with app.app_context():
        Card.query.first()
AttributeError: 'NoneType' object has no attribute 'drivername'

这是一个相当普遍的错误,因为这意味着在这条线的某个地方有一个类型为
NoneType
的对象,而
None
据我所知没有属性,因此它将引发
AttributeError
。查看问题上下文,我认为最可能的错误是指返回
None
的数据库查询

因此,当您执行以下操作时,请在代码中查找一个点:

x = Card.query.get(65) # let's say there are only 52 cards, so this is None
return x.drivername

这将导致一个
属性错误
,并显然使您的代码崩溃。因此,它将出现在由
create_app导入的任何文件中,以及它们自己导入的任何文件中(如果这相当多,请考虑最常使用数据库查询的位置)。

是的,我在python终端中所要做的就是使用load_dotenv()和find_dotenv()函数加载.env文件。本质上,在调用create_app之前,您需要加载环境变量,我不是在Python终端中以命令的形式输入环境变量,而是在脚本中自动运行环境变量。

在我的路由中查询可以正常工作。例如,当我创建一个新用户时,我将创建一个查询数据库,以检查现有用户是否使用了相同的电子邮件,并且我没有遇到任何错误。我试图通过Python终端操作我的数据库/表,这就是我遇到的问题。@aDabOfRanch好的,但在终端中运行时您没有提供
AttributeError
,这是您的代码的问题。或者你设置了一个奇怪的shell上下文。这与我发布的错误相同:AttributeError:“NoneType”对象在终端中运行时没有属性“drivername”。在顶部查看我的编辑。老实说,我认为我缺少了一些导入,因为如果我硬编码.env文件中的值,它运行得很好。@aDabOfRanch也许你的
load\u dotenv()
不起作用-你不需要把文件路径放进去吗?比如:
load_dotenv(“path/to/file/.env”)
也许不使用“secret”作为访问应用程序的密钥?@monsieuralfonse64是的,我不是随机生成的字符串,但为了简洁起见,我只是将其更改为secret。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
from main.config import Config

db = SQLAlchemy()
bcrypt = Bcrypt()
login = LoginManager()
login.login_view = 'users.login'


def create_app(config_class=Config):
    # Create app and setup config
    app = Flask(__name__)
    app.config.from_object(Config)

    # Link extensions to the app
    db.init_app(app)
    bcrypt.init_app(app)
    login.init_app(app)

    # Add route imports
    from main.users.routes import users
    from main.decks.routes import decks
    from main.cards.routes import cards
    from main.errors.handlers import errors

    # Register blueprints
    app.register_blueprint(users)
    app.register_blueprint(decks)
    app.register_blueprint(cards)
    app.register_blueprint(errors)

    return app
from dotenv import load_dotenv
import os
load_dotenv()

class Config():
    SECRET_KEY = os.getenv('SECRET_KEY')
    SQLALCHEMY_DATABASE_URI = os.getenv('SQLALCHEMY_DATABASE_URI')
SECRET_KEY="secret"
SQLALCHEMY_DATABASE_URI="sqlite:///site.db"
>> from main import db, create_app
>> from main.models import Card
>> app = create_app()
>> with app.app_context():
        Card.query.first()
AttributeError: 'NoneType' object has no attribute 'drivername'
x = Card.query.get(65) # let's say there are only 52 cards, so this is None
return x.drivername