我第一次遵循这个教程:https://python-adv-web-apps.readthedocs.io/en/latest/flask_db1.html哪个工作(我得到了一个网站的输出'它的工作')
然后,我试图按照随后的教程:https://python-adv-web-apps.readthedocs.io/en/latest/flask_db2.html
但是,我现在得到的错误:'((sqlite3.OperationalError)没有这样的表:)'
它源于以下代码:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
#from sqlalchemy.sql import text
app=Flask(__name__)
db_name='Monsters.db'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + db_name
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# this variable, db, will be used for all SQLAlchemy commands
db = SQLAlchemy(app)
class Creature(db.Model):
__tablename__ = 'Creatures'
ID = db.Column(db.Integer, primary_key=True)
Name = db.Column(db.Text)
AC = db.Column(db.Integer)
HP = db.Column(db.Integer)
@app.route('/')
def index():
try:
Creatures = Creature.query.order_by(Creature.Name).all()
print(Creatures)
sock_text = '<ul>'
for Monster in Creatures:
sock_text += '<li>' + Creatures.Name + '</li>'
sock_text += '</ul>'
return sock_text
except Exception as e:
# e holds description of the error
error_text = "<p>The error:<br>" + str(e) + "</p>"
hed = '<h1>Something is off.</h1>'
return hed + error_text
if __name__ == '__main__':
app.run(debug=True, port=5000)
我在DB Browser(SQLite)中检查了我的表,所有的名称都是正确的。我还查看了代码生成的示例文件夹。它也有一个Monsters.db文件,但使用DB Browser打开它只会得到一个空文件夹;而将其替换为实际的Monsters.db文件时,会出现错误"'list'对象没有属性'Name'",但这感觉像是我不应该做的事情。
Update: I have updated my code using the following guide - https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/quickstart/#create-the-tables
但是我不确定我是否正确地调用了SQLAlchemy. create_all(),因为它没有给出很多上下文来说明它应该在哪里使用。另外,它现在确实在我的示例文件夹中创建了这个数据库,但它是空的,这意味着我不再有错误,但我的网页是空白的。
那么,如何调用SQLAlchemy. create_all(),以便在示例文件夹中提供一个已填充的数据库呢?
更新2-最终更新:
通过阅读文档,我意识到要从已经包含数据的数据库表中读取数据,需要reflect()方法,如下所述:https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/models/
这让我找到了这个有用的答案,描述了如何做到这一点:How to build a flask application around an already existing database?
我可以将它与过时教程中的代码结合起来,得到预期的结果。最终的代码如下所示:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
db_name='Monsters.db'
engine=create_engine('sqlite:///' + db_name, echo=False)
Base=declarative_base()
Base.metadata.reflect(engine)
class Creatures(Base):
__table__ = Base.metadata.tables['Creatures']
from sqlalchemy.orm import scoped_session, sessionmaker
from flask import Flask
app=Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + db_name
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
@app.route('/')
def index():
try:
db_session=scoped_session(sessionmaker(bind=engine))
Creature=db_session.query(Creatures.ID, Creatures.Name, Creatures.HP, Creatures.AC)
sock_text = '<ul>'
for Monster in Creature:
sock_text += '<li>' + Monster.Name + '</li>'
sock_text += '</ul>'
return sock_text
except Exception as e:
# e holds description of the error
error_text = "<p>The error:<br>" + str(e) + "</p>"
hed = '<h1>Something is off.</h1>'
return hed + error_text
if __name__ == '__main__':
app.run(debug=True, port=5000)
1条答案
按热度按时间aij0ehis1#
在将其替换为实际Monsters.db文件时,会出现错误“”list“对象没有属性”Name“”
假设它应该是
Monster.Name
,而不是Creatures.Name
。