python sqlalchemy.exc.ProgrammingError:(1146,“表格'user$user.posts'不存在”)我的文件夹应用程序出错

9jyewag0  于 2023-01-04  发布在  Python
关注(0)|答案(1)|浏览(352)

以下是init文件:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:pass@host/db'
db = SQLAlchemy(app)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config["SQLALCHEMY_POOL_RECYCLE"] = 299

以下是models.py:

from yff import db, login_manager, app
from flask_login import UserMixin
import datetime
import jwt

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

class Posts(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    post_name = db.Column(db.String(50), db.ForeignKey('image.post_name'), nullable=False)
    likes = db.relationship('Like', backref='Posts', passive_deletes=True)
    date_created = db.Column(db.DateTime, nullable=False, default=datetime.datetime.now(tz=datetime.timezone.utc))
    comments = db.relationship('Comment', backref='Posts', passive_deletes=True)


class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    password = db.Column(db.String(120), unique=False, nullable=False)
    email = db.Column(db.String(50), unique=False, nullable=False)
    profile_pic = db.Column(db.String(30), unique=False, default="default.jpg")
    is_moderator = db.Column(db.Boolean, default=False)
    posts = db.relationship('Posts', backref='author', lazy=True)
    # liked_posts = db.relationship('Image', secondary=posts_liked_by_users, backref='user_that_liked')
    likes = db.relationship('Like', backref='user', passive_deletes=True)
    comments = db.relationship('Comment', backref='user', passive_deletes=True)

    def get_reset_token(self):
        encoded = jwt.encode({'user_id':self.id, "exp":datetime.datetime.now() + datetime.timedelta(hours = 0.5)}, app.config['SECRET_KEY'], algorithm='HS256')
        return encoded
    @staticmethod
    def verify_secret_token(token):
        try:
            decoded = jwt.decode(token, options={"verify_signature": False})
            user_id = decoded['user_id']

        except:
            return None
        return User.query.get(user_id)


    def __repr__(self):
        return f'{self.username}, {self.email}'

class Image(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title=db.Column(db.String(120), nullable=False)
    date_created = db.Column(db.DateTime, nullable=False, default=datetime.datetime.now(tz=datetime.timezone.utc))
    img_location = db.Column(db.String(600), nullable=False)
    mimetype = db.Column(db.String(10))
    post_name = db.Column(db.String(150),nullable=False, unique=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    manga_name = db.Column(db.String(100), unique=False, nullable=False)

class Like(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    author = db.Column(db.Integer, db.ForeignKey('user.id', ondelete="CASCADE"), nullable=False)
    post_name = db.Column(db.Integer, db.ForeignKey('posts.post_name', ), nullable=False)

class Comment(db.Model): #import it in the __init__ file
    id = db.Column(db.Integer, primary_key=True)
    text = db.Column(db.String(1000), nullable=False)
    date_created = db.Column(db.DateTime, nullable=False, default=datetime.datetime.now(tz=datetime.timezone.utc))
    author = db.Column(db.Integer, db.ForeignKey('user.id', ondelete="CASCADE"), nullable=False)
    post_name = db.Column(db.String(150), db.ForeignKey('posts.post_name', ondelete="CASCADE"), nullable=False)

下面是run.py:(它相当于app.py文件)

from yff import app, dbb #yff is the name of the package 

if __name__ == "__main__":
    print("Running.")
    with app.app_context():
        db.create_all()
        app.run()

下面是我得到的错误:

MySQLdb.ProgrammingError: (1146, "Table 'user$db.posts' doesn't exist")

sqlalchemy.exc.ProgrammingError: (MySQLdb.ProgrammingError) (1146, "Table 'user$user.posts' doesn't exist")
[SQL: INSERT INTO posts (user_id, post_name, date_created) VALUES (%s, %s, %s)]
[parameters: (3, 'ymUBEOoeiulh', datetime.datetime(2023, 1, 2, 16, 33, 0, 292336, tzinfo=datetime.timezone.utc))]

我在我的PythonAnywhere应用程序中遇到了这个错误。我打开了一个MySQL客户端并使用了“显示表;“命令,我看到只制作了图像和用户表,其余的都没有,请帮我解决这个问题!

qoefvg9y

qoefvg9y1#

请告诉我[错别字]的确切位置。
(1.)您在标题中报告了此诊断错误消息:
“表'user$user.posts'不存在”
后来你报告说:
“表'user$db.posts'不存在”
这是两个不同的模式名称:用户$user!=用户$db。
(2.)您报告了此导入:

from yff import app, dbb

然后称为db.create_all()
我的理解是db对象来自yff。但这是一个不可靠的、不可靠的理解,所以我指出了错别字并寻求澄清。对于程序错误,细节很重要,重要的是要在一个人与另一个人之间实现清晰的技术交流。
我的工作理论是,“user$user”是一个输入错误,“user$db”是我们试图在其中查找表的真正模式。
精确值... mysql://mangagen: ... /mangagen$mangagenesis
嗯,很有趣。PythonAnywhere命名方案有两个有趣的细节。它使用$美元符号,这是我在VAX/VMS时代以来在许多标识符中从未见过的符号。它使用用户名作为模式前缀,可能是为了帮助多租户托管,也可能只是为了方便报告排序顺序。
因此,粘贴在1146中的诊断消息在出现在SO中之前几乎肯定经过了编辑,而真正的消息看起来像

MySQLdb.ProgrammingError: (1146, "Table 'mangagen$mangagenesis.posts' doesn't exist")

一种可能的失败模式与引用有关,我们要求bash生成一个DB命令,并且(不存在set -u)“mangagen$mangagenesis”字符串被解释为“mangagen”,假设没有人执行“export mangagenesis=foo”,鉴于这里所有的DB交互都是纯python / JDBC,我不担心$美元符号会导致这种类型的麻烦。
OP没有在堆栈跟踪中显示源代码行号,因此不清楚是db.create_all()还是 flask 终点产生了诊断。
表之间有一些有趣的FK依赖关系。看起来源代码状态良好,应该可以工作。当前的目标应该是通过create_all(),注解掉其他内容,如运行一个flask应用程序。DB中的表与models.py中的表不同步。
若要修复,请删除现有表,然后重新运行,以便从头开始创建表集合。
如果仍然有问题,删除FK关系和关联的表,这样你就回到了一个至少能正常工作的较小的设置。然后一次扩展一个表。修复一个正常工作的东西比修复一个坏掉的东西容易得多,因为每个小实验往往会产生关于每个变化的更有用的信息。

相关问题