ValidationException: Invalid UpdateExpression

TL;DR — UpdateExpression'ınız hatalı biçimlendirilmiş. On seferin dokuzunda doğrudan kullanılan bir ayrılmış sözcüktür (status, name, sana gibi) — onu ExpressionAttributeNames'te bir #placeholder ile değiştirin. Mesaj, tam belirteci adıyla verir.

Ne anlama gelir

Tipik mesajlar:

ValidationException: Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: status
ValidationException: Invalid UpdateExpression: Syntax error; token: "=", near: "SET status ="
ValidationException: Invalid UpdateExpression: An expression attribute value used in expression is not defined; attribute value: :s

DynamoDB ifade dizesini ayrıştırır ve geçerli dilbilgisi olmayan ya da tanımsız bir yer tutucuya başvuran her şeyi reddeder.

Neden olur

  • Çıplak kullanılan ayrılmış sözcük. DynamoDB'nin yüzlerce ayrılmış sözcüğü vardır — status, name, sana, count, data, year. Bir ifadede doğrudan kullanıldıklarında bir söz dizimi hatasına neden olurlar. Ayrılmış sözcükler denetleyicisi, öznitelik adlarınızı tam listeye karşı sınar ve takma ad haritasını yayar.
  • Başvurduğunuz bir #name için eksik ExpressionAttributeNames girdisi.
  • Başvurduğunuz bir :value için eksik ExpressionAttributeValues girdisi.
  • Yanlış eylem dilbilgisi — cümleleri yanlış karıştırmak (SET, REMOVE, ADD, DELETE her birinin kendi söz dizimi vardır) ya da başıboş bir =.
  • Bir yer tutucu olmadan kullanılan özel karakterli öznitelik adı (noktalar, tireler).

Nasıl düzeltilir

  1. Her öznitelik adını ExpressionAttributeNames (#status) aracılığıyla takma adlandırın — ayrılmış sözcük listesini tamamen atlar, bu yüzden her şeyi takma adlandırmak güvenli bir alışkanlıktır.
  2. Başvurduğunuz her :value'yi ExpressionAttributeValues'te tanımlayın.
  3. Doğru cümleyi kullanın. Yazmak/üzerine yazmak için SET, bir özniteliği silmek için REMOVE, atomik sayı/küme artırmaları için ADD, bir kümeden kaldırmak için DELETE.

Örnek

import {DynamoDBClient} from '@aws-sdk/client-dynamodb';
import {DynamoDBDocumentClient, UpdateCommand} from '@aws-sdk/lib-dynamodb';

const doc = DynamoDBDocumentClient.from(new DynamoDBClient({}));

await doc.send(
  new UpdateCommand({
    TableName: 'Orders',
    Key: {pk: 'ORDER#1'},
    // #status aliases the reserved word "status"
    UpdateExpression: 'SET #status = :s, updatedAt = :t',
    ExpressionAttributeNames: {'#status': 'status'},
    ExpressionAttributeValues: {':s': 'SHIPPED', ':t': Date.now()}
  })
);

Önce DynoTable’da kontrol et

Uygulamanızda bir güncelleme başarısız olduğunda, üretim kodunu değiştirmeden önce güncellemeyi DynoTable'de yeniden oluşturun. Tabloyu ⌘K ile açın, öğeyi seçin ve satır içi güncelleme düzenleyicisini kullanın — DynoTable takma adlar ayrılmış öznitelik adlarını otomatik olarak oluşturur ve oluşturulan UpdateExpression'yi her iki öznitelik haritasıyla birlikte gösterir. Aşamalandırma (⌘S), düzenlemeyi önizlemenizi ve işleme koymadan önce sözdizimi hatalarını yakalamanızı sağlar.

Toplu düzeltmeler için, hatalı ifadeyi Expression Builder'e yapıştırın ve çıktısını SDK'nızın gönderdiğiyle karşılaştırın. Profil değiştirme (⌘P), test çalıştırmalarının hatayla aynı hesapta olmasını sağlar; Profilin eşleştiğini doğrulamak için Ayarlar → Profiller bölümündeki Bağlantıyı Test Et seçeneğini kullanın. Profil kurulumu için Connect to AWS ve Install bakın. Hata status veya data gibi belirli bir belirteci adlandırdığında reserved words checker'daki öznitelik adlarını çapraz kontrol edin. Yalnızca ayrılmış olanlara değil, her öznitelik adına takma ad vermek, bu tür hataları tamamen önleyen güvenli bir alışkanlıktır.

Kaynaklar

İlgili hatalar

Kaynaklar

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalış

DynamoDB’nin çalıştıramadığı gerçek SQL’i çalıştıran hızlı bir DynamoDB masaüstü istemcisi — JOINs, GROUP BY, toplamalar — görsel düzenleme ve kendi Bedrock anahtarların üzerinde bir yapay zekâ aracısıyla.

30 günlük ücretsiz deneme, kredi kartı yok — ardından süre sınırı olmayan Ücretsiz plan.