python - 属性错误 : can't set attribute when connecting to sqlite database with flask-sqlalchemy

标签 python sqlalchemy flask-sqlalchemy

我一直在学习 Flask Web 应用程序框架并且对它感到很舒服。我以前构建了一个简单易用的应用程序,它运行良好。我在同一个项目上工作,但尝试使用 TDD 来实现它。我遇到了以前从未见过的数据库错误,不知道如何修复。
当我检查我的代码时,我看不到任何问题。它看起来也与工作项目的代码相同,所以我真的不知道我做错了什么。
这是错误:

(env) PS C:\coding-projects\task-master-tdd> flask shell
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:43:08) [MSC v.1926 32 bit (Intel)] on win32
App: project [development]
Instance: C:\coding-projects\task-master-tdd\instance
>>> from project import db
>>> db
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py", line 1060, in __repr__
    self.engine.url if self.app or current_app else None
  File "c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py", line 943, in engine
    return self.get_engine()
  File "c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py", line 962, in get_engine
    return connector.get_engine()
  File "c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py", line 555, in get_engine
    options = self.get_options(sa_url, echo)
  File "c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py", line 570, in get_options
    self._sa.apply_driver_hacks(self._app, sa_url, options)
  File "c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py", line 914, in apply_driver_hacks
    sa_url.database = os.path.join(app.root_path, sa_url.database)
AttributeError: can't set attribute
>>>
我的 config.py 文件:
import os

# load the environment variables from the .env file
from dotenv import load_dotenv
load_dotenv()

# Determine the folder of the top-level directory of this project
BASEDIR = os.path.abspath(os.path.dirname(__file__))


class Config:
    FLASK_ENV = 'development'
    TESTING = False
    DEBUG = False
    SECRET_KEY = os.getenv('SECRET_KEY', default='A very terrible secret key.')
    SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL',
                                        default=f"sqlite:///{os.path.join(BASEDIR, 'instance', 'app.db')}")
    SQLALCHEMY_TRACK_MODIFICATIONS = False

class DevelopmentConfig(Config):
    DEBUG = True

class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL',
                                        default=f"sqlite:///{os.path.join(BASEDIR, 'instance', 'test.db')}")

class ProductionConfig(Config):
    FLASK_ENV = 'production'
我的用户模型:
from project import db, login_manager
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash

class User(db.Model, UserMixin):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String, unique=True)
    hashed_password = db.Column(db.String)

    def __init__(self, username, password):
        self.username = username
        self.hashed_password = generate_password_hash(password)

    def is_password_valid(self, password):
        return check_password_hash(self.hashed_password, password)

    def __repr__(self):
        return '<User {}>'.format(self.id)

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

最佳答案

编辑
如果您遇到这种情况,将 Flask-SQLAlchemy 升级到 >= 2.5 应该可以解决每个 https://github.com/pallets/flask-sqlalchemy/issues/910#issuecomment-802098285 的问题。 .
不再需要将 SQLAlchemy 固定到 ~1.3。

我早些时候遇到了这个问题,但我想我已经弄清楚发生了什么。
SQLAlchemy 自动安装为 Flask-SQLAlchemy 的依赖项,其最新版本 (1.4.0) 引入了以下重大更改:

The URL object is now an immutable named tuple. To modify a URL object, use the URL.set() method to produce a new URL object.


我只需安装以前版本的 SQL Alchemy (1.3.23) 即可解决此问题。

关于python - 属性错误 : can't set attribute when connecting to sqlite database with flask-sqlalchemy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66647787/

相关文章:

python - TensorFlow,为什么选择 python 语言?

python - 为什么我在用 python 抓取时无法获取字符串?

python - ipython:在应用程序中启动内核和内核管理器

python - 如何彻底拆除数据库连接和 session ?

python - SQL - 查找与当前日期匹配的条目

python - 使用python、sqlalchemy在sql数据库上轻松检查表是否存在

python-3.x - 为什么当验证器条件不满足时 wtforms 不产生错误?

python - matplotlib 中有没有办法检查当前显示的轴区域中有哪些艺术家?

python - 将商品添加到购物车时是否应该使用 WTForms 作为按钮?

python-3.x - SQLAlchemy scoped_session 没有从数据库获取最新数据