[已解决][提问帖]Flask-分开Models解决循环引用及构造文件

:face_with_hand_over_mouth:代码被我改来改去剩一口气…有木有大神抢救一下…我会上传源码压缩包
不改动里面文件名-文件夹名
只要让这个源码运行不报错,页面可以显示’hello’,可以让数据库初始化
我是想解决分离 连接数据库的配置信息/class类的代码
我应该是搞混在这个构造文件上,不晓得问题出在哪里
@greyli 李哥可以看下么
@yannanxiu 大神没事也来指点下

点击下载源码

源码文件watchlistapp/init.py

# -*- coding:utf-8 -*-

from flask import Flask
from watchlistapp.c_extend.exts import db
# from flask_sqlalchemy import SQLAlchemy
from watchlistapp.b_configure import db_config

app = Flask(__name__)
app.config.from_object(db_config)
# 数据库连接
# db = SQLAlchemy()
db.init_app(app)

from watchlistapp.a_main import *

源码文件a_main/viewapp.py

# -*- coding:utf-8 -*-

from watchlistapp import app
from watchlistapp.b_configure.db_class import *


@app.route('/')
def hello():
    # 增加
    # movieusers = Movieusers(username='test', userpassword='1111')
    # db.session.add(movieusers)
    # db.session.commit()

    # 查询
    # result = Movieusers.query.filter(Movieusers.username == 'Tc_Dhl').first()
    # getmovieusers = result
    # print(getmovieusers.username)
    # print(getmovieusers.userpassword)

    # 删除
    # movieusers = Movieusers.query.filter(Movieusers.content == 'test').first()
    # db.session.delete(movieusers)
    # db.session.commit()

    # 找到电影名为xxx的用户
    # movielist = Movielist.query.filter(Movielist.title=='电影1').first()
    # print(movielist.movieusers_id_get.username)

    # 寻找用户名'Tc_Dhl'下对应的电影名
    # movieusers = Movieusers.query.filter(Movieusers.username == 'Tc_Dhl').first()
    # result = movieusers.movielist
    # for movielist in result:
    #     print("-" * 10)
    #     print(movielist.title)
    return ('hello')

源码文件b_configure/db_class.py

# -*- coding:utf-8 -*-

from watchlistapp.c_extend.exts import db


class Movieusers(db.Model):# 表名将会是 movieusers(自动生成,小写处理)
    __tablename__ = 'movieusers'# 自定义表名字
    id = db.Column(db.Integer, primary_key=True)# 主键
    username = db.Column(db.String(20), nullable=False)# 名字
    userpassword = db.Column(db.String(20), nullable=False)# 密码

class Movielist(db.Model):# 表名将会是 movielist
    __tablename__ = 'movielist'# 自定义表名字
    id = db.Column(db.Integer, primary_key=True)# 主键
    movieusers_id = db.Column(db.INTEGER, db.ForeignKey('movieusers.id'))# 外键 对应movieusers表中的id
    title = db.Column(db.String(60), nullable=False)# 电影标题
    year = db.Column(db.String(4), nullable=False)# 电影年份
    movieusers_id_get = db.relationship('Movieusers', backref=db.backref('movielist'))# 反向引用,从1表寻找2表对应的数据
db.create_all()

源码文件b_configure/db_config.py

# -*- coding:utf-8 -*-

DIALECT = 'mysql'# 数据库类型
DRIVER = 'pymysql'# 连接数据库的驱动
USERNAME = 'root'# 用户名
PASSWORD = 'dhlmysql'# 密码
HOST = '192.168.121.128'# 连接地址
PORT = '3306'# 端口
DATABASE = 'tcgamelist2'# 数据库名
DB_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8mb4".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST,PORT, DATABASE)
# app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_POOL_TIMEOUT = 10# 连接数据库超时10s连接失败
SQLALCHEMY_POOL_RECYCLE = 1200# 连接数据库后1200s后,断开闲置连接
SQLALCHEMY_ECHO = False# [调试]关闭打印sql语句
SQLALCHEMY_TRACK_MODIFICATIONS = False# [调试]关闭追踪数据库的修改

源码文件c_extend/exts.py

# -*- coding:utf-8 -*-

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

目录结构:

watchlist [
.venv-watchlist-----虚拟目录文件夹
watchlistapp--------程序文件夹
.flaskenv
]
watchlistapp[
a_main----------主视图的在这里
b_configure-----存放数据库的连接文件和class文件
c_extend--------存放ext文件
d_static----------这个不用管
e_templates----这个不用管
init.py------------构造文件
]

一、watchlistapp\__init__.py 添加 db.app = app

# -*- coding:utf-8 -*-

from flask import Flask
from watchlistapp.c_extend.exts import db
# from flask_sqlalchemy import SQLAlchemy
from watchlistapp import db_config

app = Flask(__name__)
app.config.from_object(db_config)
# 数据库连接
# db = SQLAlchemy()
db.init_app(app)
db.app = app  # 添加这个

from watchlistapp.a_main import *

二、把db_config.py文件从b_configure文件夹移到watchlistapp主目录下

> ls
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2019/12/18     10:27                a_main
d-----       2019/12/18     10:46                b_configure
d-----       2019/12/18     10:27                c_extend
d-----       2019/12/18     10:27                d_static
d-----       2019/12/18     10:27                e_templates
d-----       2019/12/18     10:27                __pycache__
-a----       2019/12/18     10:46            765 db_config.py   # 注意这里
-a----       2019/12/18     10:47            358 __init__.py

修改from watchlistapp.b_configure import db_configfrom watchlistapp import db_config

1 个赞

为什么要单独吧db_config.py给拎出来呢,是什么缘由
还有db.app = app 这个是什么意思

我修改了一处,就是增加了db.app = app,不会报错 数据库也连接上了,这一句不晓得是什么意思