sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1146, "Table 'fisher.user' doesn't

问题

我在做用户注册界面,前台表单传入注册信息保存至数据库时,网页报以下错误:

sqlalchemy.exc.ProgrammingError
sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1146, "Table 'fisher.user' doesn't exist")
[SQL: INSERT INTO user (status, password, nickname, phone_number, email, confirmed, beans, send_counter, receive_counter, wx_open_id, wx_name) VALUES (%(status)s, %(password)s, %(nickname)s, %(phone_number)s, %(email)s, %(confirmed)s, %(beans)s, %(send_counter)s, %(receive_counter)s, %(wx_open_id)s, %(wx_name)s)]
[parameters: {'status': 1, 'password': 'pbkdf2:sha256:150000$i3aqpu9v$d0bbc1f35a0868bc909e92c64b5daa91a5c4385446158284cd393e32edd84f6c', 'nickname': '二狗', 'phone_number': None, 'email': '1@qq.com', 'confirmed': 0, 'beans': 0, 'send_counter': 0, 'receive_counter': 0, 'wx_open_id': None, 'wx_name': None}]
(Background on this error at: http://sqlalche.me/e/f405)

Traceback (most recent call last)

解决问题的方法

sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1146, “Table ‘fisher.user’ doesn’t exist”),重点在于**"Table ‘fisher.user’ doesn’t exist**,我是在用flask框架创建网站,采用ORM(对象关系映射)技术,将面向对象语言程序中的对象自动持久化到关系数据库中,查找原因很久,最后发现实体类User在项目主文件中没有被执行,导致对应的数据库fisher中没有创建user表,所以当前台表单传入注册信息保存至数据库时,才报此错误,我在项目主文件中导入实体类所在的文件,解决了这个问题。

解决问题的历程

当刚刚看这个问题时,我的第一反应,就是我可能漏写了什么。我这个小白,是按照视频按部就班写的代码,怎么错了呢?,我马上,对照视频内容,一遍又一遍地对照,没发现什么呀(可能我真的比较粗心看漏了,至今还没发现吧,哈哈哈)。
我的第二反应就是马上复制错误信息,百度一下。看了一些博客,才冷静地发现重点在于**"Table ‘fisher.user’ doesn’t exist**,数据库中没有这个表存在,这些博客的方法就是建立该表,我也想建该表,但我在项目中找不到实体类User没有被映射到数据库的原因,而我在数据库中发现另一个实体类Book被映射到数据库中,创建了book表,奇怪了!我怀疑我的User类有问题,马上我检查User类,发现没有错,原因不在这。
我的第三反应就是研究分析实体类Book为什么被创建。我在数据库中把Book类删掉,再次执行项目程序,发现它依然可以被创建,我开始检查项目主程序:
fisher.py:

from app import create_app

app = create_app()


if __name__ == '__main__':
    app.run(debug=app.config['DEBUG'], threaded=True)

create_app()所在的文件__init__.py:

from flask import Flask
from app.models.book import db



def create_app():
    app = Flask(__name__)

    app.config.from_object('app.secure')
    app.config.from_object('app.setting')

    db.init_app(app)
    db.create_all(app=app)

    register_blueprint(app)
    return app


def register_blueprint(app):
    from app.web import web
    app.register_blueprint(web)


book.py:

from sqlalchemy import Column, Integer, String

from app.models.base import db


class Book(db.Model):
    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(50), nullable=False)
    author = Column(String(30), default='未名')
    binding = Column(String(20))
    publisher = Column(String(50))
    price = Column(String(20))
    pages = Column(Integer)
    pubdate = Column(String(20))
    isbn = Column(String(15), nullable=False, unique=True)
    image = Column(String(50))

python程序代码是自上至下顺序执行的,主文件执行时,会跳转至create_app函数所在的文件,又在该文件中自上至下顺序执行的,整个文件执行下去,到‘from app.models.book import db’,python执行跳转至app.models.book.py寻找db,由于这个文件中包含实体类Book,所以程序会执行Book类,从而将其映射到数据库中(虽然python是到导入文件book.py寻找要导入的元素db,但并不是找到所需元素db,就停止代码的执行,而是会继续执行db所在文件的后续代码,这就包括了Book类)。在检查到这时,我发现两个问题:

  • 第一:我导入db文件路径错了,因为db不是在app.models.book.py创建的,得改!
  • 第二:sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1146, “Table ‘fisher.user’ doesn’t exist”)出现该问题原因:实体类User没有被python执行导致没有将实体映射到数据库中创建user表

找到原因,问题就好解决了,我修改了db导入路径,又将实体类所在的文件导入,修改如下:
create_app()所在的文件__init__.py:

from flask import Flask

from app.models.base import db  # 修改后的db导入路径
from app.models import user  # 导入实体类User所在的文件


def create_app():
    app = Flask(__name__)

    app.config.from_object('app.secure')
    app.config.from_object('app.setting')

    db.init_app(app)
    db.create_all(app=app)

    register_blueprint(app)
    return app


def register_blueprint(app):
    from app.web import web
    app.register_blueprint(web)


修改后,运行项目,项目正常!开心!

第一次写博客的感想

这是我第一次写博客,心里十分激动,其实很早的时候,就有人鼓励我写写博客,以后好找工作,但我这个人胆子小,感觉不好意思,毕竟我是菜鸟,也没什么可以写的,没啥技术,又没文笔,所以一直没写博客。后来,我在一次又一次百度搜索问题时,发现很多的答案或者解决问题的思路,我是在博客上找到的,我慢慢地觉得博客挺有用的,大家可以分享自己的问题和解决方法,我为什么不这么做了?在平时,我费了许多功夫,找到的解决问题方法,也可以提供给别人,就像别人帮助我一样,让大家少走一些弯路,这样不好吗?而且我找到的方法,一般没有保存,时间久了,就忘了,以后碰到了,还要找,挺麻烦的,我想不如和大家一样写写博客,记录学习,帮助他人(给别人提供思路也好呀),也帮助自己。
不说了,感觉自己在写小学作文(又烂又啰嗦),哈哈哈。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

枫梓漠

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值