sqlite 如何使用flak-sqlalchemy将flask连接到数据库?

5vf7fwbs  于 2023-01-02  发布在  SQLite
关注(0)|答案(1)|浏览(193)

我第一次遵循这个教程: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)
aij0ehis

aij0ehis1#

在将其替换为实际Monsters.db文件时,会出现错误“”list“对象没有属性”Name“”

for Monster in Creatures:
    sock_text += '<li>' + Creatures.Name + '</li>'

假设它应该是Monster.Name,而不是Creatures.Name

相关问题