SQLAlchemy错误与类,但没有函数

时间:2018-02-07 14:51:35

标签: python oop jenkins flask sqlalchemy

以下在Jenkins中执行烧瓶应用程序的上下文中运行时起作用:

将一个函数从一个文件导入另一个文件:

def return_countries(db):
    db.session.expire_on_commit = False
    q = db.session.query(Country.countrycode).distinct().all()
    q = [t[0] for t in q]
    return q

在导入文件的内部,我这样称呼它:

print(return_countries(db))

当这个工作在Jenkins运行时,它没有问题。

问题是,我想要一个数据库调用,然后多次使用返回的国家/地区代码列表,而不是不必要继续查询相同的事情。为了保持整洁,试图把它放在课堂上。是的,它可以在没有类的情况下完成,但可能需要在代码库的几个部分中,可能需要使用其他方法,因此如果类可以工作则会更清晰。

所以我注释掉了这个函数定义并将以下类插入到一个文件中:

class checkCountries:
    def __init__(self, db):
        db.session.expire_on_commit = False
        __q = db.session.query(Country.countrycode).distinct().all()
        __q = [t[0] for t in __q]
        print(__q)

    def check(self, __q, countrycode):
        if countrycode in __q:
            return True
        else:
            return False

...更新了另一个文件中的import语句,并直接在import语句下实例化:

cc = checkCountries(db)

并用以下内容替换了上面的print语句:

print('check for DE: ', cc.check('DE'))
print('check for ES: ', cc.check('ES'))
print('check for GB: ', cc.check('GB'))

但是它在Jenkins日志中生成了一个错误。回溯很长,但下面可能是相关的摘录。

有什么想法吗?我对__q

所做的事情感到有些不对劲
/python3.6/site-packages/sqlalchemy/util/_collections.py", line 988, in __call__
15:26:01     return self.registry[key]
15:26:01 KeyError: 123456789123456
15:26:01 
15:26:01 During handling of the above exception, another exception occurred:
15:26:01 
15:26:01 Traceback (most recent call last):

/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 922, in get_app
15:26:01     raise RuntimeError('application not registered on db '
15:26:01 RuntimeError: application not registered on db instance and no application bound to current context
15:26:02 Build step 'Execute shell' marked build as failure
15:26:02 Finished: FAILURE

1 个答案:

答案 0 :(得分:0)

我得到了它的工作,所以这是我正在使用的类现在有效:

class checkCountries:
    def __init__(self, db, app):
        db.init_app(app)
        with app.app_context():
            db.session.expire_on_commit = False
            self.__q = db.session.query(Country.countrycode).distinct().all()
        self.__q = [t[0] for t in self.__q]
        print(self.__q)

    def check(self, countrycode):
        if countrycode in self.__q:
            return True
        else:
            return False

然后,实例化它的行现在需要2个参数:

cc = checkCountries(db, app)

其余部分与上述问题相同。

来自This answer

@mark_hildreth帮助了,谢谢!

是的,它有不止一件事。该类不是很正确,但在简化的应用程序中进行了调试并使其正常工作但是sqlalchemy特有的此错误消息仍然存在。

可能它与类中的变量有关,与阻止它绑定到Flask application context

的函数有关。