32
votes

AttributError: Impossible de définir l'attribut lors de la connexion à la base de données SQLite avec Flask-Sqlalchemy

J'ai appris le cadre d'application Web Flask et je me sens assez à l'aise avec cela. J'ai déjà construit une application simple à faire qui a parfaitement fonctionné. Je travaillais sur le même projet, mais essayant de l'implémenter en utilisant TDD. J'ai rencontré une erreur avec la base de données que je n'ai jamais vue auparavant et je ne sais pas comment corriger.

Lorsque j'examine mon code, je ne vois aucun problème. Il semble également identique au code du projet de travail, donc je ne sais vraiment pas ce que je fais de mal.

p> mon fichier config.py:

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))


2 commentaires

J'ai travaillé sur un projet depuis quelques jours et j'ai rencontré cette même erreur exacte, même si je n'ai modifié rien d'important / pertinent. Curieusement, je rencontre maintenant le même problème lorsque je crée un projet de test frais et totalement séparé qui me lance un peu de boucle.


J'ai soudainement le même problème sans rien changer. Peut-être qu'une dépendance à la bibliothèque a été modifiée?


6 Réponses :


0
votes

vient de faire face à la même erreur exacte. Il s'avère que j'ai eu la mauvaise bibliothèque Flask-Sqlalchemy installée. Je l'ai installé à l'aide de conda au lieu de PIP, et Conda a installé celle appropriée pour mon système d'exploitation et mon environnement. XXX


0 commentaires

-3
votes

J'ai résolu ce problème en remplaçant Application_Driver_Hacks dans la classe SQLALCHEMY. Dans cette nouvelle méthode, j'ai supprimé cette ligne: sa_url.database = os.path.join (app.root_path, sa_url.database) . J'ai copié le reste de la méthode.

class MySQLAlchemy(SQLAlchemy):
    def apply_driver_hacks(self, app, sa_url, options):
        ...

La méthode peut être trouvée ici . Le correctif que j'ai décrit ne devrait être que temporaire. Le problème peut être résolu dans les versions plus récentes de Flask-Sqlalchemy.


1 commentaires

Désolé, où puis-je trouver cette méthode?



43
votes

modifier

Si vous vivez cela, la mise à niveau de Flask-Sqlalchemy à> = 2.5 devrait résoudre le problème par https://github.com/pallets/flask-sqlalchemy/issues/910#issuecomment-802098285 .

épingler sqlalchemy à ~ 1,3 ne devrait plus être nécessaire.


J'ai rencontré ce problème un peu plus tôt, mais je pense que j'ai compris ce qui se passe.

Sqlalchemy est automatiquement installé comme une dépendance pour Flask-Sqlalchemy et sa dernière version (1.4.0) introduit le changement de rupture suivant:

L'objet URL est maintenant un tuple nommé immuable. Pour modifier un objet URL, utilisez la méthode url.set () pour produire un nouvel objet URL.

J'ai pu résoudre ce problème en installant simplement la version précédente de SQL Alchemy (1.3.23).



10
votes

Vérifiez que ce problème vous affecte en exécutant xxx

Vous devez constater que la version actuelle de Sqlalchemy est 1.4.0 . J'ai trouvé que la solution la plus rapide pour l'instant consiste à revenir manuellement à une version précédente de sqlalchemy:

pip freeze > requirements.txt

si vous venez de revenir à la version précédente et cela fonctionne alors maintenant est un Beaucoup de temps pour épingler vos versions:

pip install SQLAlchemy==1.3.23


0 commentaires


4
votes

confirmant Réponse de npburns224 / supershoot : Mise à niveau Flask-Sqlalchemy (et donc sa dépendance sqlalchemy ) à la dernière version a fait l'astuce pour moi.

pip install --upgrade flask-sqlalchemy

J'exécute maintenant FLASK-SQLALCHEMY 2.5.1 et SQLALCHEMY 1.4.3 avec succès.


0 commentaires