arrow_back
Résolue thumb_up

Problème de création de base de données avec Flask sous Windows 11

# Variables # Flask # Bases de données

Bonjour ,
Je n'arrive pas à creer ma base de donnée todo.db
(voir le tuto sur flask ci dessous

ci dessous le message d'erreur sachant que je suis sous windows 11 et pas sur mac

>>> from app import db,Task
>>> db.create_all()
Traceback (most recent call last):
  File "<python-input-2>", line 1, in <module>
    db.create_all()
    ~~~~~~~~~~~~~^^
  File "C:\Users\Antunes Sebastien\Desktop\Dashboard\BOOTSTRAP en partant de 0\todo_app\.env\Lib\site-packages\flask_sqlalchemy\extension.py", line 900, in create_all
    self._call_for_binds(bind_key, "create_all")
    ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Antunes Sebastien\Desktop\Dashboard\BOOTSTRAP en partant de 0\todo_app\.env\Lib\site-packages\flask_sqlalchemy\extension.py", line 871, in _call_for_binds
    engine = self.engines[key]
             ^^^^^^^^^^^^
  File "C:\Users\Antunes Sebastien\Desktop\Dashboard\BOOTSTRAP en partant de 0\todo_app\.env\Lib\site-packages\flask_sqlalchemy\extension.py", line 687, in engines
    app = current_app._get_current_object()  # type: ignore[attr-defined]
  File "C:\Users\Antunes Sebastien\Desktop\Dashboard\BOOTSTRAP en partant de 0\todo_app\.env\Lib\site-packages\werkzeug\local.py", line 519, in _get_current_object
    raise RuntimeError(unbound_message) from None
RuntimeError: Working outside of application context.

This typically means that you attempted to use functionality that needed
the current application. To solve this, set up an application context
with app.app_context(). See the documentation for more information.
>>> 

Je n'aie pas compris non plus comment exporter mes variables d'environnement sous windows 11

set FLASK_APP=app.py
set FLASK_ENV=development

Pouvez vous débloquer la situation ?
Merci ...

Gabriel Trouvé

Mentor

Salut :)

En fait tu dois exécuter ton code dans un context :

def create_app():
    app = Flask(__name__)

    with app.app_context():
        init_db()

    return app

Ils en parlent ici dans la doc : https://flask.palletsprojects.com/en/stable/appcontext/

A mon avis ta commande est "hors-contexte" pour flask. Tu as ton exemple de code ?

le code est ici
c'est un tutorial
https://www.docstring.fr/blog/creer-une-todo-app-avec-flask/

le code que j'incrimine est la ligne

db.create_all()

qui ne me créer pas mon fichier todo.db .

J'arrive à passer outre cette ligne en tapant la commande

flask shell

mais je me fait rattraper dans mon terminal lorsque je tape
sqlite3 todo.db
sqlite> .table     # cette ligne me creer mon fichier todo.db alors que ce n'est pas ce que je lui demande de faire

en fait , je n'arrive pas à crée mon fichier todo.db correctement et je n'arrive pas à appeler la class "Task" .
Et logiquement les commandes sqlite>.table me répondent qu'il n'y a pas de table crée .

ci dessous mes frappes claviers

 C:\Users\Antunes Sebastien\Desktop\Dashboard\BOOTSTRAP en partant de 0\todo_app\.env> flask shell
Python 3.13.0 (tags/v3.13.0:60403a5, Oct  7 2024, 09:38:07) [MSC v.1941 64 bit (AMD64)] on win32
App: app
Instance: C:\Users\Antunes Sebastien\Desktop\Dashboard\BOOTSTRAP en partant de 0\todo_app\.env\var\app-instance
>>> from app import db, Task
>>> db.create_all()  
>>> exit()
now exiting InteractiveConsole...
PS C:\Users\Antunes Sebastien\Desktop\Dashboard\BOOTSTRAP en partant de 0\todo_app\.env> sqlite3 .\todo.db
SQLite version 3.47.2 2024-12-07 20:39:59
Enter ".help" for usage hints.
sqlite> .table
sqlite> .table
sqlite>

Gabriel Trouvé

Mentor

Re,

alors regarde :)

# todo_app/app.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__) # Crée un instance de la classe Flask, c'est notre app
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db' # Nom de la bdd
db = SQLAlchemy(app) # Lie notre app à SQLAlchemy

class Task(db.Model): # Modèle
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    created_at = db.Column(db.DateTime, nullable=False, default=datetime.now)


@app.route("/")
def index(): # Méthode appelée quand on se rend sur la route "/"
    return "Hello World!"


if __name__ == '__main__':
    app.run(debug=True)

Ici le app.run me permet de me passer des exports.

Et ma base de donnée est bien présente quand j'exécute :

Mais comme tu peux le voir, je le fais dans le contexte de mon application, sinon j'ai l'erreur que tu as mentionné tout à l'heure.

On peut voir que la structure de ma base est bien présente aussi :

Aussi, fait bien attention que ton environnement virtuel est bien activé, et que les librairies :

pip install flask
pip install flask_sqlalchemy 

Est-ce que c'est bon pour toi ?

Bonjour , Oui cela fonctionne à present mais j'aie du compléter les imports avec
from app import db,Task,app
Si j'omet un des db , Task ou app cela ne fonctionne pas .
De plus la base de donnée a bien été crée mais dans un dossier "var"/"app-instance" .Je ne
sais pas trop pourquoi et je m'en suis aperçu par hasard .

La preuve par le contenu de mon terminal , je peux recoller à la suite du tutorial .

```
PS C:\Users\Antunes Sebastien\Desktop\Dashboard\BOOTSTRAP en partant de 0\todo_app.env\Scripts> .\activate
(.env) PS C:\Users\Antunes Sebastien\Desktop\Dashboard\BOOTSTRAP en partant de 0\todo_app.env\Scripts> cd ..
(.env) PS C:\Users\Antunes Sebastien\Desktop\Dashboard\BOOTSTRAP en partant de 0\todo_app.env> python
Python 3.13.0 (tags/v3.13.0:60403a5, Oct 7 2024, 09:38:07) [MSC v.1941 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

from app import db,Task
with app.app_context():
... db.create_all()
...
Traceback (most recent call last):
File "<python-input-1>", line 1, in <module>
with app.app_context():
^^^
NameError: name 'app' is not defined
from app import db,Task,app
with app.app_context():
... db.create_all()
...
exit()
(.env) PS C:\Users\Antunes Sebastien\Desktop\Dashboard\BOOTSTRAP en partant de 0\todo_app.env> cd .\var\
(.env) PS C:\Users\Antunes Sebastien\Desktop\Dashboard\BOOTSTRAP en partant de 0\todo_app.env\var> cd .\app-instance\
(.env) PS C:\Users\Antunes Sebastien\Desktop\Dashboard\BOOTSTRAP en partant de 0\todo_app.env\var\app-instance> sqlite3 .\todo.db
SQLite version 3.47.2 2024-12-07 20:39:59
Enter ".help" for usage hints.
sqlite> .table
task
sqlite> .schema task
CREATE TABLE task (
id INTEGER NOT NULL,
name VARCHAR(50) NOT NULL,
created_at DATETIME NOT NULL,
PRIMARY KEY (id)
);
sqlite></module></python-input-1>

```

Salut,

Oui pour l'import db je l'avais importé plus haut dans le terminal. Du coup j'ai oublié de te le spécifier.

Si c'est ok pour toi c'est top.

Si tu veux customiser le chemin de la BDD tu peux jouer avec :

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db' # Nom de la bdd

A bientôt

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte person

Rechercher sur le site

open_in_new

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.