不能创建表

来源:4-5 完成客户端注册

cu97ming

2020-07-22

报错输出:

raise errorclass(errno, errorvalue)
sqlalchemy.exc.ProgrammingError: (cymysql.err.ProgrammingError) (1146, "Table 'ginger.user' doesn't exist")
[SQL: SELECT user.password AS user_password, user.create_time AS user_create_time, user.status AS user_status, user.id AS user_id, user.email AS user_email, user.nickname AS user_nickname, user.auth AS user_auth 
FROM user 
WHERE user.email = %s AND user.status = %s 
 LIMIT %s]
[parameters: ('admin@qq.com', 1, 1)]
(Background on this error at: http://sqlalche.me/e/13/f405)

代码展示:

/app/app.py

from flask import Flask


def register_blueprints(app):
    from app.api.v1 import create_blueprint_v1
    app.register_blueprint(create_blueprint_v1(), url_prefix='/v1')


def register_plugin(app):
    from app.models.base import db
    db.init_app(app)
    with app.app_context():
        db.create_all()


def create_app():
    app = Flask(__name__)
    app.config.from_object('app.config.setting')
    app.config.from_object('app.config.secure')
    register_blueprints(app)
    register_plugin(app)
    return app

/ginger.py (main 文件)

from app.app import create_app
app = create_app()
if __name__ == '__main__':
    app.run(debug=True)
模型文件

/app/models/base.py

from datetime import datetime

from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy, BaseQuery
from sqlalchemy import inspect, Column, Integer, SmallInteger, orm
from contextlib import contextmanager


class SQLAlchemy(_SQLAlchemy):
    @contextmanager
    def auto_commit(self):
        try:
            yield
            self.session.commit()
        except Exception as e:
            db.session.rollback()
            raise e
        finally:
            db.session.close()


class Query(BaseQuery):
    def filter_by(self, **kwargs):
        if 'status' not in kwargs.keys():
            kwargs['status'] = 1
        return super(Query, self).filter_by(**kwargs)


db = SQLAlchemy(query_class=Query)


class Base(db.Model):
    __abstract__ = True
    create_time = Column(Integer)
    status = Column(SmallInteger, default=1)

    def __init__(self):
        self.create_time = int(datetime.now().timestamp())

    def __getitem__(self, item):
        return getattr(self, item)

    @property
    def create_datetime(self):
        if self.create_time:
            return datetime.fromtimestamp(self.create_time)
        else:
            return None

    def set_attrs(self, attrs_dict):
        for key, value in attrs_dict.items():
            if hasattr(self, key) and key != 'id':
                setattr(self, key, value)

    def delete(self):
        self.status = 0

/app/models/user.py

from datetime import datetime

from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy, BaseQuery
from sqlalchemy import inspect, Column, Integer, SmallInteger, orm
from contextlib import contextmanager


class SQLAlchemy(_SQLAlchemy):
    @contextmanager
    def auto_commit(self):
        try:
            yield
            self.session.commit()
        except Exception as e:
            db.session.rollback()
            raise e


class Query(BaseQuery):
    def filter_by(self, **kwargs):
        if 'status' not in kwargs.keys():
            kwargs['status'] = 1
        return super(Query, self).filter_by(**kwargs)


db = SQLAlchemy(query_class=Query)


class Base(db.Model):
    __abstract__ = True
    create_time = Column(Integer)
    status = Column(SmallInteger, default=1)

    def __init__(self):
        self.create_time = int(datetime.now().timestamp())

    def __getitem__(self, item):
        return getattr(self, item)

    @property
    def create_datetime(self):
        if self.create_time:
            return datetime.fromtimestamp(self.create_time)
        else:
            return None

    def set_attrs(self, attrs_dict):
        for key, value in attrs_dict.items():
            if hasattr(self, key) and key != 'id':
                setattr(self, key, value)

    def delete(self):
        self.status = 0

    def keys(self):
        return self.fields

    def hide(self, *keys):
        for key in keys:
            self.fields.remove(key)
        return self

    def append(self, *keys):
        for key in keys:
            self.fields.append(key)
        return self


class MixinJSONSerializer:
    @orm.reconstructor
    def init_on_load(self):
        self._fields = []
        # self._include = []
        self._exclude = []

        self._set_fields()
        self.__prune_fields()

    def _set_fields(self):
        pass

    def __prune_fields(self):
        columns = inspect(self.__class__).columns
        if not self._fields:
            all_columns = set(columns.keys())
            self._fields = list(all_columns - set(self._exclude))

    def hide(self, *args):
        for key in args:
            self._fields.remove(key)
        return self

    def keys(self):
        return self._fields

    def __getitem__(self, key):
        return getattr(self, key)

问题排查:

/Users/admin/PycharmProjects/ts_rsapi/venv/bin/python /Users/admin/PycharmProjects/ts_rsapi/ginger.py
/Users/admin/PycharmProjects/ts_rsapi/venv/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py:834: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
2020-07-22 15:25:53,943 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
2020-07-22 15:25:53,943 INFO sqlalchemy.engine.base.Engine ()
2020-07-22 15:25:54,054 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'lower_case_table_names'
2020-07-22 15:25:54,054 INFO sqlalchemy.engine.base.Engine ()
2020-07-22 15:25:54,276 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2020-07-22 15:25:54,276 INFO sqlalchemy.engine.base.Engine ()
2020-07-22 15:25:54,482 INFO sqlalchemy.engine.base.Engine show collation where `Charset` = 'utf8mb4' and `Collation` = 'utf8mb4_bin'
2020-07-22 15:25:54,483 INFO sqlalchemy.engine.base.Engine ()
2020-07-22 15:25:54,592 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1
2020-07-22 15:25:54,592 INFO sqlalchemy.engine.base.Engine ()
2020-07-22 15:25:54,696 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1
2020-07-22 15:25:54,696 INFO sqlalchemy.engine.base.Engine ()
2020-07-22 15:25:54,812 INFO sqlalchemy.engine.base.Engine SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8mb4) COLLATE utf8mb4_bin AS anon_1
2020-07-22 15:25:54,812 INFO sqlalchemy.engine.base.Engine ()
 * Serving Flask app "app.app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
/Users/admin/PycharmProjects/ts_rsapi/venv/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py:834: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
2020-07-22 15:25:56,343 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
2020-07-22 15:25:56,343 INFO sqlalchemy.engine.base.Engine ()
2020-07-22 15:25:56,445 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'lower_case_table_names'
2020-07-22 15:25:56,445 INFO sqlalchemy.engine.base.Engine ()
2020-07-22 15:25:56,659 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2020-07-22 15:25:56,659 INFO sqlalchemy.engine.base.Engine ()
2020-07-22 15:25:56,882 INFO sqlalchemy.engine.base.Engine show collation where `Charset` = 'utf8mb4' and `Collation` = 'utf8mb4_bin'
2020-07-22 15:25:56,882 INFO sqlalchemy.engine.base.Engine ()
2020-07-22 15:25:56,997 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1
2020-07-22 15:25:56,997 INFO sqlalchemy.engine.base.Engine ()
2020-07-22 15:25:57,102 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1
2020-07-22 15:25:57,102 INFO sqlalchemy.engine.base.Engine ()
2020-07-22 15:25:57,210 INFO sqlalchemy.engine.base.Engine SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8mb4) COLLATE utf8mb4_bin AS anon_1
2020-07-22 15:25:57,210 INFO sqlalchemy.engine.base.Engine ()
 * Debugger is active!
 * Debugger PIN: 291-400-406

补充说明:

直接去老师的源码下载发现是可以的,但是我的就是不行,然后我直接把老师这 ginger.pyapp.py(老师的在 /app/__init.py)、/app/models/base.py 、/app/models/user.py /app/config/secure.py 都复制过来了也是一样不会创建数据库表

写回答

1回答

7七月

2020-07-22

我看这里是select报错的?不是插入数据有问题

0
0

Python Flask高级编程之RESTFul API前后端分离精讲

RESTFul+权限管理+token令牌+扩展flask=提升编程思维

2037 学习 · 359 问题

查看课程