刚接触flask,想自己建个博客,遇到sqlite操作错误的问题。我在 Github 和 Stackoverflow 上研究过类似的问题,但我没有遇到过旧问题中的典型拼写错误或错误。如果有人能帮助我,我将不胜感激,这真的很棒,因为这个问题就像要了我的命,已经花了我两天时间,我感觉很糟糕。
在代码中,我定义了表名“users_table”,并在开始时运行“db.create_all()”来创建表,但是每次提交时都会出现“no such table user_table”错误更新用户信息。
这是我测试 SQLite 操作的方式:
(under /project) python3 manage.py shell
>>> u = User(email='foo@bar.com', 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
我已将代码最小化为以下四个部分,这些部分可能会再次出现错误消息:
/项目/应用程序/__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
/项目/应用程序/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)
项目/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,
}
项目/管理.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()
原文由 nonemaw 发布,翻译遵循 CC BY-SA 4.0 许可协议
我刚刚完成了 Flask 应用程序的设置,并处理了此类问题。
I strongly suspect the problem here is that the instance of
db
that you are creating in__init__.py
is unaware of the contents ofmodels.py
, including theUser
类。 Thedb
object in__init__.py
is a totally separate object from thedb
you are creating inmodels.py
.因此,当您在db.create_all()
__init__.py
,它正在检查它知道的表列表,但没有找到任何表。我遇到了这个确切的问题。我发现模型(如
User
)已注册到特定的db
模型类定义中列出的对象(例如class User(db.Model):
)。所以基本上我的理解是解决这个问题的方法是运行
db.create_all()
使用用于定义模型的db
的相同实例。换句话说,从 --- 运行db.create_all()
models.py
。这是我的代码,您可以看到我是如何设置它的:
app.py
:models.py
: