siyuan-note/siyuan · error

[%s] parameter [%s] is deprecated, visit [https://github.com

Error message

[%s] parameter [%s] is deprecated, visit [https://github.com/siyuan-note/siyuan/issues/15727] for details

What it means

The batchSetAttributeViewBlockAttrs API rejects requests using the deprecated 'rowID' parameter in the value objects. Per issue 15727 the parameter was renamed (to itemID semantics) and, after the deprecation window ending 2026-12-01, will be removed; the kernel hard-fails with this error while logging a warning.

Source

Thrown at kernel/model/attribute_view.go:8035

func BatchUpdateAttributeViewCells(tx *Transaction, avID string, values []any) (err error) {
	attrView, err := av.ParseAttributeView(avID)
	if err != nil {
		return
	}

	for _, value := range values {
		v := value.(map[string]any)
		keyID := v["keyID"].(string)
		var itemID string
		if _, ok := v["itemID"]; ok {
			itemID = v["itemID"].(string)
		} else if _, ok := v["rowID"]; ok {
			// TODO 该参数将于 2026 年 12 月 1 日后删除
			itemID = v["rowID"].(string)
			msg := fmt.Sprintf("[%s] parameter [%s] is deprecated, visit [https://github.com/siyuan-note/siyuan/issues/15727] for details",
				"/api/av/batchSetAttributeViewBlockAttrs", "rowID")
			logging.LogWarn(msg)
			err = errors.New(msg)
			return
		}
		valueData := v["value"]
		_, err = updateAttributeViewValue(tx, attrView, keyID, itemID, valueData, false)
		if err != nil {
			return
		}
	}
	regenAttrViewGroups(attrView)
	if err = av.SaveAttributeView(attrView); err != nil {
		return
	}
	refreshRelatedSrcAvs(avID, tx)
	return
}

func UpdateAttributeViewCell(tx *Transaction, avID, keyID, itemID string, valueData any) (val *av.Value, err error) {
	return updateAttributeViewCellInBlock(tx, avID, "", keyID, itemID, valueData)

View on GitHub (pinned to 8641553a1f)

Solutions

  1. Rename the "rowID" key to the current expected key in each entry object
  2. Update the plugin/script to match the API documented in issue 15727
  3. Pin and later upgrade: until 2026-12-01 fix callers proactively since the parameter will be removed

Example fix

// before
{ "keyID": k, "rowID": "20240101120000-abcd", "value": v }
// after
{ "keyID": k, "itemID": "20240101120000-abcd", "value": v }
Defensive patterns

Strategy: validation

Validate before calling

for (const entry of payload) { if ("rowID" in entry) throw new Error("rowID is deprecated; use itemID"); }

Type guard

const usesDeprecatedParam = (entry) => Object.prototype.hasOwnProperty.call(entry, "rowID");

Try / catch

try { await batchSetAttrs(payload); } catch (e) { if (String(e).includes("rowID") && String(e).includes("deprecated")) retryWithItemID(payload); else throw e; }

Prevention

When it happens

Trigger: POSTing to /api/av/batchSetAttributeViewBlockAttrs with an entry object that contains a "rowID" key instead of the current parameter name.

Common situations: Older plugins or scripts written before the parameter rename; copied sample code from old blog posts; third-party integrations not updated after the API change.

Understand the failure class

Background: "is deprecated and will be removed" — deprecation warnings for old API names, keywords, and options, and how to migrate before the removal release — this error's family across 29 libraries.

Related errors


AI-assisted analysis of siyuan-note/siyuan@8641553a1f (2026-09-11). Data as JSON: /api/errors/98100fb86b277e33. Report an issue: GitHub.