sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table
Je suis frais à la fiole et était en train de construire un blog sur le mien, et j'ai rencontré un problème avec SQLite erreur d'opération. J'ai fait des recherches similaires problème sur Github et Stackoverflow mais aucun typique de la faute de frappe ou une erreur de vieilles questions qui m'arrive. Il serait apprécié et vraiment génial si quelqu'un peut m'aider parce que ce problème est comme en train de me tuer et déjà m'a coûté deux jours, je me sens vraiment mal.
Dans le code je l'ai défini le nom de la table qui est "users_table" et exécuter "db.create_all()" au début pour créer la table, mais l'erreur de garde qui se produisent avec "no such table user_table" à chaque fois, lorsqu'un commit qui se passe pour mettre à jour les infos de l'utilisateur.
C'est comment j'ai tester le SQLite opération:
(under /project) python3 manage.py shell
>>> u = User(email='[email protected]', username='foobar', password='player')
>>> db.create_all()
>>> db.session.add(u)
>>> db.session.commit() # with following error message
Traceback (most recent call last):
File "C:\...\Python\Python36-32\lib\site-packages\sqlalchemy\engine\base.py", line 1182, in _execute_context
context)
File "C:\...\Python\Python36-32\lib\site-packages\sqlalchemy\engine\default.py", line 470, in do_execute
cursor.execute(statement, parameters)
sqlite3.OperationalError: no such table: users_table
...
...
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: users_table
J'ai minimisé le code en quatre sections suivantes, qui peuvent se reproduire le message d'erreur:
/project/app/__init__.py:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import config
db = SQLAlchemy()
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
db.init_app(app)
return app
/project/app/models.py:
import os
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash
from flask import Flask
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = 'users_table'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, index=True)
username = db.Column(db.String(64), unique=True, index=True)
password_hash = db.Column(db.String(128))
def __repr__(self):
return '<User %r>' % self.username
@property
def password(self):
raise AttributeError('Password is not a readable attribute')
@password.setter
def password(self, password):
self.password_hash = generate_password_hash(password)
project/config.py:
import os
basedir = os.path.abspath(os.path.dirname(\__file__))
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'fhuaioe7832of67^&*T#oy93'
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
@staticmethod
def init_app(app):
pass
class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data.sqlite')
config = {
'development': DevelopmentConfig,
'default': DevelopmentConfig,
}
project/manage.py:
import os
from app import create_app, db
from app.models import User
from flask_script import Manager, Shell
app = create_app(os.getenv('FLASK_CONFIG') or 'default')
manager = Manager(app)
def make_shell_context():
return dict(app=app, db=db, User=User)
manager.add_command("shell", Shell(make_context=make_shell_context))
if __name__ == '__main__':
manager.run()
OriginalL'auteur nonemaw | 2017-07-06
Vous devez vous connecter pour publier un commentaire.
Je viens de terminé de configurer un Flacon app et j'ai eu affaire avec ce genre de problème.
Je soupçonne fortement que le problème ici est que l'instance de
db
que vous créez dans__init__.py
est pas au courant du contenu demodels.py
, y compris laUser
classe. Ledb
objet dans__init__.py
est totalement un objet distinct de l'db
que vous créez dansmodels.py
. Ainsi, lorsque vous exécutezdb.create_all()
dans__init__.py
, c'est la vérification de la liste de tables qu'il connaît et qui n'est pas de le trouver. Je suis tombé sur ce problème précis.Ce que j'ai découvert est que les modèles (comme
User
) sont enregistrés auprès du particulierdb
l'objet qui est répertorié dans le modèle de définition de la classe (par exemple,class User(db.Model):
).Donc, fondamentalement, ma compréhension est que le moyen de résoudre ce problème consiste à exécuter
db.create_all()
à l'aide de la même instance dedb
qui est utilisé pour définir les modèles. En d'autres termes, exécutezdb.create_all()
de l'intérieurmodels.py
.Voici mon code donc vous pouvez voir comment je l'ai mis en place:
app.py
:models.py
:Est-il possible de montrer exactement comment vous l'avez fait, ou l'instruction d'importation dans le models.py fichier?
Je ne suis pas sûr de ce que vous faites allusion à; le models.py l'exemple ci-dessus t inclure l'instruction d'importation:
from app import db
Je voulait savoir exactement ce que vous avez fait pour résoudre le problème, il avait simplement expliqué. De toute façon, j'ai eu la solution par le déroulement de la migration et puis une migration. Il a travaillé pour moi.
OriginalL'auteur Nathan Wailes