Python SQLAlchemy和pylint
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
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()