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
engine
和BASE
构造使用全局变量。我不确定如何重构这段代码以使这些变量不是全局的,因为参数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对pylint不是很友好。
你有几个问题。
一。公共方法太少
此错误通常是错误的,请参见此处:What does pylint's "Too few public methods" message mean
2。未使用的导入
皮林在这个案子里是对的!如果导入declarative_base
,则可以直接使用它:declarative_base(...)
,而不是通过sqlalchemy.ext.declarative.declarative_base()
。
通常-如果导入未使用,请尝试删除它并检查代码(和单元测试,注意doctests!)仍然有效。如果是这样的话,进口确实没有使用过。
是的,您使用的是代码,但不使用导入的名称。
三。无效的常量名称
Pylint在这个例子中是错误的,但在原则上是有点正确的。
(我花了很多时间说服甚至是优秀的程序员只需重写Pylint的const-rgx
设置……)。
基本上,Pylint相信每个全局变量都是常数。对你来说不是。所以,pylint试图阻止您使用全局变量。
此外,您不应该在函数之外(在全局范围内)编写global engine
。应该是这样的:engine = None
Pylint仍然会抱怨错误的常量名。您可以显式地消除此警告。(我不建议将其重命名为ENGINE
)
四。(额外)SQLAlchemy查询生成
我发现了这个问题,因为我想看看在SQLAlchemy条件下pylint的建议。
与Django模型不同,SQLAlchemy使用比较==
来获得一个相等的条件(Django的field_gt=5
实际上很笨拙,随着时间的推移,我不得不喜欢SQLAlchemy的方式)。但派林特会抱怨:
session.query(AlarmState).filter(AlarmState.is_default == True).one()
给予
C0121: comparison to True should be just 'expr' or 'expr is True'
一切都很好,在这种情况下,我们真的可以写:
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(not AlarmState.is_default .all()
!!! -它似乎按False
条件筛选,并返回一个空集。这里也是:sess.query(AlarmState).filter(AlarmState.is_default is False).all()
。我找到了一个办法-你可以写:
session.query(AlarmState).filter(AlarmState.is_default.__eq__(False)).all()
两者都是:
给出正确的结果
不会引起派林特的注意
我只是对此感觉不太好。它在用这个愚蠢的工具玩猫捉老鼠。
我在想其他人会怎么做,我就是这样来的。
编辑-好的,我找到了正确的方法。。。
如何将列与
False
(无投诉)进行比较?from sqlalchemy import not_
session.query(AlarmState).filter(not_(AlarmState.is_default)).all()
这就是
not_
可能是为了。。。