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

在使用Flask和ORM遇到sqlalchemy.exc.ProgrammingError,提示Table 'fisher.user'不存在。问题根源是实体类User未执行导致数据库中未创建对应表。通过检查和修改导入路径,成功将User类映射到数据库并解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

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

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)


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

第一次写博客的感想

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

生成的sql有问题: raise errorclass(errno, errval) sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '} END,\ncustomer = CASE\nWHEN sku = 'Z1D03B00AD32CE79A5163Z' THEN 158\nWHEN sku = '' at line 23") [SQL: UPDATE t_offer_info SET saler_score = CASE WHEN sku = %(key_0)s THEN %(saler_score_0)s WHEN sku = %(key_1)s THEN %(saler_score_1)s WHEN sku = %(key_2)s THEN %(saler_score_2)s WHEN sku = %(key_3)s THEN %(saler_score_3)s WHEN sku = %(key_4)s THEN %(saler_score_4)s WHEN sku = %(key_5)s THEN %(saler_score_5)s WHEN sku = %(key_6)s THEN %(saler_score_6)s WHEN sku = %(key_7)s THEN %(saler_score_7)s WHEN sku = %(key_8)s THEN %(saler_score_8)s WHEN sku = %(key_9)s THEN %(saler_score_9)s WHEN sku = %(key_10)s THEN %(saler_score_10)s WHEN sku = %(key_11)s THEN %(saler_score_11)s WHEN sku = %(key_12)s THEN %(saler_score_12)s WHEN sku = %(key_13)s THEN %(saler_score_13)s WHEN sku = %(key_14)s THEN %(saler_score_14)s WHEN sku = %(key_15)s THEN %(saler_score_15)s WHEN sku = %(key_16)s THEN %(saler_score_16)s WHEN sku = %(key_17)s THEN %(saler_score_17)s WHEN sku = %(key_18)s THEN %(saler_score_18)s WHEN sku = %(key_19)s THEN %(saler_score_19)s ELSE {col} END, customer = CASE WHEN sku = %(key_0)s THEN %(customer_0)s WHEN sku = %(key_1)s THEN %(customer_1)s WHEN sku = %(key_2)s THEN %(customer_2)s WHEN sku = %(key_3)s THEN %(customer_3)s WHEN sku = %(key_4)s THEN %(customer_4)s WHEN sku = %(key_5)s THEN %(customer_5)s WHEN sku = %(key_6)s THEN %(customer_6)s WHEN sku = %(key_7)s THEN %(customer_7)s WHEN sku = %(key_8)s THEN %(customer_8)s WHEN sku = %(key_9)s THEN %(customer_9)s WHEN sku = %(key_10)s THEN %(customer_10)s WHEN sku = %(key_11)s THEN %(customer_11)s WHEN sku = %(key_12)s THEN %(customer_12)s WHEN sku = %(key_13)s THEN %(customer_13)s WHEN sku = %(key_14)s THEN %(customer_14)s WHEN sku = %(key_15)s THEN %(customer_15)s WHEN sku = %(key_16)s THEN %(customer_16)s WHEN sku = %(key_17)s THEN %(customer_17)s WHEN sku = %(key_18)s THEN %(customer_18)s WHEN sku = %(key_19)s THEN %(customer_19)s ELSE {col} END WHERE sku IN (%(sku_0)s,%(sku_1)s,%(sku_2)s,%(sku_3)s,%(sku_4)s,%(sku_5)s,%(sku_6)s,%(sku_7)s,%(sku_8)s,%(sku_9)s,%(sku_10)s,%(sku_11)s,%(sku_12)s,%(sku_13)s,%(sku_14)s,%(sku_15)s,%(sku_16)s,%(sku_17)s,%(sku_18)s,%(sku_19)s)] [parameters: {'key_0': 'Z1D03B00AD32CE79A5163Z', 'saler_score_0': 4.8, 'key_1': 'Z8F10294E91F2D7D62E10Z', 'saler_score_1': 4.8, 'key_2': 'ZAF5F7EA26402545B78CCZ', 'saler_score_2': 4.8, 'key_3': 'Z779B4AF6E3266F5D91C2Z', 'saler_score_3': 4.8, 'key_4': 'Z826E2C5B1529CD23E9B5Z', 'saler_score_4': 4.8, 'key_5': 'Z26A665DE4787BA0AE7D4Z', 'saler_score_5': 4.8, 'key_6': 'ZD5CA810500167A3CBBCCZ', 'saler_score_6': 4.8, 'key_7': 'Z65E67086B1D75AF0BEE3Z', 'saler_score_7': 4.8, 'key_8': 'ZC41A881C97D6D10A6830Z', 'saler_score_8': 4.8, 'key_9': 'Z66099A00658818ECA0B2Z', 'saler_score_9': 4.8, 'key_10': 'Z9748D36000FEDE033C5EZ', 'saler_score_10': 4.9, 'key_11': 'Z1FDC2F9CE99B175E2C5AZ', 'saler_score_11': 4.8, 'key_12': 'Z7979354FEBF3D8CBEA5BZ', 'saler_score_12': 4.8, 'key_13': 'ZE2399C4D2FE10C0B30FDZ', 'saler_score_13': 4.8, 'key_14': 'Z50B6086CE8B0C774E5B3Z', 'saler_score_14': 4.8, 'key_15': 'N31985097A', 'saler_score_15': 4.8, 'key_16': 'Z3E03FE75F38DEFC3E762Z', 'saler_score_16': 4.9, 'key_17': 'N43636512A', 'saler_score_17': 4.8, 'key_18': 'N42962838A', 'saler_score_18': 4.9, 'key_19': 'Z2CD404C49F79F8137521Z', 'saler_score_19': 4.9, 'customer_0': 158, 'customer_1': 153, 'customer_2': 153, 'customer_3': 153, 'customer_4': 153, 'customer_5': 153, 'customer_6': 153, 'customer_7': 153, 'customer_8': 153, 'customer_9': 153, 'customer_10': 137, 'customer_11': 128, 'customer_12': 120, 'customer_13': 118, 'customer_14': 109, 'customer_15': 68, 'customer_16': 67, 'customer_17': 66, 'customer_18': 62, 'customer_19': 61, 'sku_0': 'Z1D03B00AD32CE79A5163Z', 'sku_1': 'Z8F10294E91F2D7D62E10Z', 'sku_2': 'ZAF5F7EA26402545B78CCZ', 'sku_3': 'Z779B4AF6E3266F5D91C2Z', 'sku_4': 'Z826E2C5B1529CD23E9B5Z', 'sku_5': 'Z26A665DE4787BA0AE7D4Z', 'sku_6': 'ZD5CA810500167A3CBBCCZ', 'sku_7': 'Z65E67086B1D75AF0BEE3Z', 'sku_8': 'ZC41A881C97D6D10A6830Z', 'sku_9': 'Z66099A00658818ECA0B2Z', 'sku_10': 'Z9748D36000FEDE033C5EZ', 'sku_11': 'Z1FDC2F9CE99B175E2C5AZ', 'sku_12': 'Z7979354FEBF3D8CBEA5BZ', 'sku_13': 'ZE2399C4D2FE10C0B30FDZ', 'sku_14': 'Z50B6086CE8B0C774E5B3Z', 'sku_15': 'N31985097A', 'sku_16': 'Z3E03FE75F38DEFC3E762Z', 'sku_17': 'N43636512A', 'sku_18': 'N42962838A', 'sku_19': 'Z2CD404C49F79F8137521Z'}] (Background on this error at: https://sqlalche.me/e/20/f405)
最新发布
06-07
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值