SQLAlchemy 2.0无法读取SQLite表?

pn9klfpd  于 2023-04-12  发布在  SQLite
关注(0)|答案(1)|浏览(183)

我已经用这个脚本测试了SQLite数据库,它工作正常:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.sql import text

db = SQLAlchemy()
app = Flask(__name__)
db_name = 'sockmarket.db'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + db_name
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db.init_app(app)

@app.route('/')
def testdb():
    try:
        db.session.query(text('1')).from_statement(text('SELECT 1')).all()
        return '<h1>It works.</h1>'
    except Exception as e:
        error_text = "<p>The error:<br>" + str(e) + "</p>"
        hed = '<h1>Something is broken.</h1>'
        return hed + error_text

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

然后我尝试使用新的SQLAlchemy select命令,但失败了:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.sql import text

db = SQLAlchemy()
app = Flask(__name__)
db_name = 'sockmarket.db'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + db_name
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db.init_app(app)

class Sock(db.Model):
    __tablename__ = 'socks'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    style = db.Column(db.String)
    color = db.Column(db.String)
    quantity = db.Column(db.Integer)
    price = db.Column(db.Float)
    updated = db.Column(db.String)

@app.route('/')
def index():
    try:
        socks = db.session.execute(db.select(Sock)
        .filter_by(style='mini')
        .order_by(Sock.name)).scalars()
        
        sock_text = '<ul>'
        for sock in socks:
            sock_text += '<li>' + sock.name + ', ' + sock.color + '</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 broken.</h1>'
        return hed + error_text

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

我一遍又一遍地检查模型。脚本写入UL标记,但它们之间没有任何内容。它没有抛出错误。我还在Python解释器中运行SQLAlchemy命令来验证,是的,数据库在那里,表是可读的。这是一个已经存在的数据库和表。此外,这个安装程序在几个月前的旧版本的SQLAlchemy上工作得很好。相同的模型。旧版本中的select语句是这样的:

socks = Sock.query.filter_by(style='mini').order_by(Sock.name).all()
ih99xse1

ih99xse11#

解决方案:尽管第一个脚本在没有路径的情况下工作正常,第二个脚本 * 过去 * 在没有路径的情况下工作正常,但现在第二个脚本需要SQLite数据库的路径-即使.db文件与此Python脚本位于同一目录中,并且在dir中也有一个__init__.py文件。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os.path

db = SQLAlchemy()
app = Flask(__name__)
db_name = 'sockmarket.db'
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
db_path = os.path.join(BASE_DIR, db_name)

我希望这能为其他人节省我花在解决这个问题上的时间。

相关问题