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
- Rename the "rowID" key to the current expected key in each entry object
- Update the plugin/script to match the API documented in issue 15727
- 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
- Use itemID everywhere; grep codebases for "rowID" payloads
- Read issue 15727 and update integrations before 2026-12-01
- Add a lint/test asserting the request schema has no rowID
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
- parent ID is required
- previous ID and next ID cannot both be specified
- database field name and type are required
- attribute view item markdown is nil
- new item template [%s] not found
AI-assisted analysis of siyuan-note/siyuan@8641553a1f (2026-09-11).
Data as JSON: /api/errors/98100fb86b277e33.
Report an issue: GitHub.