You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask+SQLAlchemy运行报SQLALCHEMY_DATABASE_URI相关错误如何解决

报错原因

你在main.py和model.py两个文件中分别创建了独立的Flask应用实例与SQLAlchemy实例:

  • 你仅在main.py的app实例中配置了SQLALCHEMY_DATABASE_URI
  • model.py中绑定模型的db实例对应的是该文件内初始化的无数据库配置的app实例
  • 调用model.Doc.query时触发的是无配置的db实例,因此抛出找不到数据库URI的报错
修复步骤

1. 修改model.py代码

删除文件内独立初始化的Flask app实例,调整为延迟绑定扩展的模式,修改后代码如下:

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column, Integer, String, Date, ForeignKey
from flask_marshmallow import Marshmallow

# 仅初始化扩展,不绑定应用实例,后续在主文件中绑定
db = SQLAlchemy()
ma = Marshmallow()


class Aud(db.Model):
    __tablename__ = 'aud'
    __table_args__ = {'schema': 'cirsx'}
    aud_num = Column(Integer, primary_key=True)
    aud_name = Column(String, nullable=False, unique=True)
    aud_desc = Column(String)


class AudSchema(ma.Schema):
    class Meta:
        fields = ('aud_num', 'aud_name', 'aud_desc')


class DocTyp(db.Model):
    __tablename__ = 'doctyp'
    __table_args__ = {'schema': 'cirsx'}
    doctyp_num = Column(Integer, primary_key=True)
    doctyp_name = Column(String, nullable=False, unique=True)
    doctyp_desc = Column(String)


class DocTypSchema(ma.Schema):
    class Meta:
        fields = ('doctyp_num', 'doctyp_name', 'doctyp_desc')


class Doc(db.Model):
    __tablename__ = 'doc'
    __table_args__ = {'schema': 'cirsx'}
    doc_num = Column(Integer, primary_key=True)
    # 修正外键写法,需指定 schema.表名.字段名
    doctyp_num = Column(Integer, ForeignKey('cirsx.doctyp.doctyp_num'))
    aud_num = Column(Integer, ForeignKey('cirsx.aud.aud_num'))
    doc_path = Column(String, nullable=False)
    title = Column(String, nullable=False)
    author = Column(String)
    keywords = Column(String)
    pub_dt = Column(Date)
    doc_abs = Column(String)
    doc_txt = Column(String)


class DocSchema(ma.Schema):
    class Meta:
        fields = ('doc_num',
                  'doctyp_num',
                  'aud_num',
                  'doc_path',
                  'title',
                  'author',
                  'keywords',
                  'pub_dt',
                  'doc_abs',
                  'doc_txt')


aud_schema = AudSchema()
aud_schemas = AudSchema(many=True)
doctyp_schema = DocTypSchema()
doctyp_schemas = DocTypSchema(many=True)
doc_schema = DocSchema()
doc_schemas = DocSchema(many=True)

2. 修改main.py代码

移除重复初始化的SQLAlchemy实例,将配置好的app绑定到model中定义的扩展,修改后代码如下:

import psycopg2
import model
import os
from flask import Flask, jsonify, request

uname = os.environ['uname']
pas = os.environ['pas']
url = os.environ['url']
port = os.environ['port']
dbase = os.environ['dbase']


app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://' + uname + ':' + pas + '@' + url + ':' + port + '/' + dbase
# 给model中的扩展绑定当前app
model.db.init_app(app)
model.ma.init_app(app)


@app.route('/test')
def test():
    tst = model.Doc.query.filter_by(doc_num=1).first()
    # 用定义好的schema序列化模型对象,否则jsonify会报错
    return jsonify(model.doc_schema.dump(tst))


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

附加优化建议

可以额外添加app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False关闭不必要的对象修改追踪,减少性能开销。

内容的提问来源于stack exchange,提问作者Brad Davison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:54:03