不能创建表
来源: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
补充说明:
写回答
1回答
-
7七月
2020-07-22
我看这里是select报错的?不是插入数据有问题
00
相似问题