Python SQLAlchemy和pylint

Python SQLAlchemy和pylint,python,sqlalchemy,pylint,Python,Sqlalchemy,Pylint,SQLAlchemy似乎给了我一大堆无法解决的pylint错误 第一个问题是每个表必须定义为一个新类 例如: class Person(BASE): """Person Table Definition""" __tablename__ = 'person' id = Column(Integer, primary_key=True) name = Column(String(30)) …导致每个表出现这些错误,我定义: W: 20, 0: Class has

SQLAlchemy似乎给了我一大堆无法解决的pylint错误

第一个问题是每个表必须定义为一个新类

例如:

class Person(BASE):
    """Person Table Definition"""
    __tablename__ = 'person'
    id = Column(Integer, primary_key=True)
    name = Column(String(30))
…导致每个表出现这些错误我定义:

W: 20, 0: Class has no __init__ method (no-init)
R: 20, 0: Too few public methods (0/2) (too-few-public-methods)
第二个问题是对SQLAlchemy
引擎
构造使用全局变量。我不确定如何重构此代码以使这些变量不是全局变量,因为必须将参数
BASE
传递到上面的表类定义中

BASE = sqlalchemy.ext.declarative.declarative_base()
global engine
...
def create_sqla_engine():
    """Create the SQLA engine"""
    global engine
    engine = create_engine('mysql+mysqlconnector://root:@127.0.0.1:3306/sqlalchemy_example')
我是python新手,但这看起来很难看。派林也对此表示不满:

C: 51, 0: Invalid constant name "engine" (invalid-name)
最后,pylint认为我没有使用我在代码中明确使用的导入

W: 15, 0: Unused declarative_base imported from sqlalchemy.ext.declarative (unused-import)
W: 16, 0: Unused sessionmaker imported from sqlalchemy.orm (unused-import)

…为什么?pylint与python3不兼容吗?我是否应该在所使用的方法中导入所需的模块,而不是在文件的顶部?

SQLAlchemy不是非常友好的

你的问题有几点

1.公共方法太少 此错误通常是错误的,请参见此处:

2.未使用的进口 派林在这种情况下是正确的!如果导入
declarative\u base
,则可以直接使用它:
declarative\u base(…)
,而不是通过
sqlalchemy.ext.declarative.declarative\u base()

通常-如果导入未使用,请尝试删除它并检查代码(以及单元测试,请注意doctest!)是否仍然有效。如果是这样的话,进口品确实没有使用

TL;DR-是的,您使用的是代码,但不使用导入的名称

3.无效的常量名称 Pylint在这种情况下是错误的,但在原则上是正确的

(我花了很多时间说服即使是体面的程序员也只需覆盖Pylint的
const rgx
设置…)

基本上,派林认为每个全局变量都是常数。对你来说不是。因此,pylint试图阻止您使用全局变量

另外,您不应该在函数之外(在全局范围内)编写
全局引擎
。应该是这样的:

engine=None

Pylint仍然会抱怨错误的常量名称。您可以明确地使此警告静音。(我不建议将其重命名为
引擎

4.(额外)SQLAlchemy查询大楼 我发现了这个问题,因为我想看看pylint在SQLAlchemy条件下的建议

与Django模型不同,SQLAlchemy使用比较
=
来获得相等条件(Django的
字段\u gt=5
实际上很笨拙,随着时间的推移,我不得不喜欢SQLAlchemy的方式)。但派林会抱怨:

session.query(AlarmState).filter(AlarmState.is_default == True).one()
给予

这一切都很好——在这种情况下,我们真的可以写:

session.query(AlarmState).filter(AlarmState.is_default).one()
很好

但是,关于:

session.query(AlarmState).filter(AlarmState.is_default == False).all()
我们得到:

C0121: comparison to False should be just 'not expr' or 'expr is False'
现在怎么办?这不起作用:
session.query(AlarmState).filter(非AlarmState.is_default.all()
!!!-它似乎按
False
条件进行筛选,并返回一个空集。此处相同:
sess.query(AlarmState).filter(AlarmState.is_default为False)。all()

我找到了一种解决方法——你实际上可以写:

session.query(AlarmState).filter(AlarmState.is_default.__eq__(False)).all()
这两者都是:

  • 给出正确的结果
  • 不会引起派林的注意
我只是感觉不太好。这是在用这个愚蠢的工具玩猫捉老鼠的游戏。 我想知道其他人对此做了什么,这就是我为什么来到这里的原因

编辑-好的,我找到了“正确”的方法

如何将列与
False
(无投诉)进行比较?
这就是
not
可能的用途…

虽然
BASE
不应该引起任何问题,
全局引擎
确实是一种代码气味。了解如何从方法返回引擎实例。您只需要少量使用引擎;您应该主要从
sessionmaker
请求会话,这很便宜。对于有元类的类,比如表,有“no init”和“太少的公共方法”。有时这是
not_u
的完美用法,尽管我更喜欢可读性更高的
session.query(AlarmState).filter(AlarmState.is_default.is_u(False)).all()
。它还可以很好地处理对真/假值不进行相等比较的问题。
session.query(AlarmState).filter(AlarmState.is_default.__eq__(False)).all()
from sqlalchemy import not_
session.query(AlarmState).filter(not_(AlarmState.is_default)).all()