1、使用flask_sqlalchemy时报错:
File "/Users/xxxx/flask/wfisher/app/models/base.py", line 29, in <module>
db = SQLAlchemy(query_class = Query)
TypeError: __init__() got an unexpected keyword argument 'query_class'
base.py 源代码如下:
# -*- coding: utf-8 -*-
from contextlib import contextmanager
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy, BaseQuery
from sqlalchemy import Column, Integer, SmallInteger
class Query(BaseQuery):
def filter_by(self, **kwargs):
if 'status' not in kwargs.keys():
kwargs['status'] = 1
return super(Query, self).filter_by(**kwargs)
class SQLAlchemy(_SQLAlchemy):
@contextmanager
def auto_commit(self):
try:
yield
self.session.commit()
except Exception as e:
db.session.rollback()
raise e
db = SQLAlchemy(query_class = Query)
进入flask_sqlalchemy的__init__.py文件中,查看初始化方法如下:
class SQLAlchemy(object):
def __init__(self, app=None,
use_native_unicode=True,
session_options=None):
self.use_native_unicode = use_native_unicode
if session_options is None:
session_options = {}
session_options.setdefault(
'scopefunc', connection_stack.__ident_func__
)
self.session = self.create_scoped_session(session_options)
self.Model = self.make_declarative_base()
self._engine_lock = Lock()
if app is not None:
self.app = app
self.init_app(app)
else:
self.app = None
_include_sqlalchemy(self)
_MapperSignalEvents(self.mapper).register()
_SessionSignalEvents().register()
self.Query = BaseQuery
可以看到__init__方法并无参数名 "query_class":
__init__(self, app=None,
use_native_unicode=True,
session_options=None)
应该是与当前版本的flask-sqlalchemy有关系,版本不同导致的错误。
查了下session_options是一个重要的参数,使用session_options 可解决我们的问题。
把如下代码:
db = SQLAlchemy(query_class = Query)
替换成:
db = SQLAlchemy(session_options = {'query_cls': Query})
编译通过 O(∩_∩)O~~