python各种问题汇总

1,188 阅读1分钟

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~~