Python SQLAlchemy中的Where子句
我有一个关于炼金术的问题 目前,我有两个使用Flask-SQLAlchemy的模型:Python SQLAlchemy中的Where子句,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我有一个关于炼金术的问题 目前,我有两个使用Flask-SQLAlchemy的模型: class Action(db.Model): __tablename__ = 'ACTION' _FIELDS_LABELS = ("ID", "MODULE_ID", "CATEGORY", "LABEL", "COMMAND", "ARGS", "FILE_ID") _REPR_FIELDS = ("MODULE_NAME", "FILE_NAME") id = db
class Action(db.Model):
__tablename__ = 'ACTION'
_FIELDS_LABELS = ("ID", "MODULE_ID", "CATEGORY", "LABEL", "COMMAND", "ARGS", "FILE_ID")
_REPR_FIELDS = ("MODULE_NAME", "FILE_NAME")
id = db.Column(_FIELDS_LABELS[0], db.Integer, primary_key=True)
module_id = db.Column(_FIELDS_LABELS[1], db.Integer, db.ForeignKey('MODULE.ID'))
category = db.Column(_FIELDS_LABELS[2], db.String())
label = db.Column(_FIELDS_LABELS[3], db.String())
command = db.Column(_FIELDS_LABELS[4], db.String())
args = db.Column(_FIELDS_LABELS[5], db.String())
file_id = db.Column(_FIELDS_LABELS[6], db.Integer(), db.ForeignKey('FILE.ID'))
file = db.relationship('File')
及
使用Flask,我尝试使用URL执行以下操作:
http://ip:port/modules/0/actions/18
所以我有一个行动蓝图:
action_blueprint = Blueprint('action',
__name__,
url_prefix="/modules/<string:module_id>/actions")
但我有以下错误:
AttributeError: 'NoneType' object has no attribute 'serialize'
生成的查询:
SELECT "ACTION"."ID" AS "ACTION_ID", "ACTION"."MODULE_ID" AS "ACTION_MODULE_ID", "ACTION"."CATEGORY" AS "ACTION_CATEGORY", "ACTION"."LABEL" AS "ACTION_LABEL", "ACTION"."COMMAND" AS "ACTION_COMMAND", "ACTION"."ARGS" AS "ACTION_ARGS", "ACTION"."FILE_ID" AS "ACTION_FILE_ID"
FROM "ACTION" JOIN "MODULE" ON "MODULE"."ID" = "ACTION"."MODULE_ID"
WHERE "MODULE"."ID" = ? AND "MODULE"."ID" = ?
查询的结尾有问题,但我真的不知道
action = Action.query.join(Module).filter(Module.id == module_id).filter_by(**request.args.to_dict()).first()
是否正确。通过查看生成的查询,您的问题有些明显
WHERE "MODULE"."ID" = ? AND "MODULE"."ID" = ?
应该表明有什么不对劲,除非两个值相同,在这种情况下谓词是多余的。很明显
request.args.to_dict()
生成一个类似于
{ 'id': <some value> }
谢谢这是我当前使用的请求。但它不是对指定模块操作的筛选器。这可能是,但在您的示例中,请求args dict有一个密钥id,然后使用当前代码从模块中提取该密钥id。我忘了在答案中加上,因为
Query.first()
可能不会返回任何结果,您应该为此做好准备。你真的应该在问题中添加这样的细节。现在完全不清楚request.args实际上是什么,除了观察到的效果之外,还有什么作用。
request.args.to_dict()
{ 'id': <some value> }
action = Action.query...first()
if action:
return jsonify(action.serialize)
else:
# Handle not found