데이터베이스 where 문 질문드립니다.

안녕하세요 메타본 엔터테인먼트 클라이언트 개발자입니다.

데이터베이스 안내문을 참고하며 사용처리문을 작성하고있습니다 현재 처리중인 부분은 이제 길드에 대한 metadata에 포함시키기 어려운 공용데이터의 처리를 위해 데이터베이스를 작성한 부분인데 첨부된 사진과 같이 Where 문의 Id 값과 실제 조건비교를 하는 string 값이 다른데도 불구하고 result 값이 출력되고있는 상황이라 Where 문에서 제가 간과하고있는 개발상 주의사항이 있는지 확인하고싶어 문의드렸습니다.

안녕하세요 개발자님,
문의해주신 내용과 관련해 상세 확인 후 안내드릴 수 있도록 하겠습니다.

패키지 레벨에서 확인해봤을때 catch문의 warning 부분에
Expression analysis failed: Expression MemberAccess cannot be evaluated at compile time. Use local variables: var id = 5; Where(x => x.Id == id). Platform: WindowsEditor. Falling back to runtime evaluation may not work. Consider using multiple Where() calls instead.

이 오류가 발생하고있어서 공유드립니다.

해결됬습니다.

private async UniTask<BACKND.Database.Guildinfo> GetGuildInfoDatabase()
{
    if (UserGameData.Get().MyGuild == null)
        return null;

    try
    {
        var indate = UserGameData.Get().MyGuild.inDate;

        var result = await (BackendManager.Instance.DBClient.From<BACKND.Database.Guildinfo>().Where(x => x.Id == indate).FirstOrDefault());

        if (result == null)
        {
            await BackendManager.Instance.DBClient.From<BACKND.Database.Guildinfo>().Insert(CreateGuildInfoDatabase(indate));
        }

        return result;
    }
    catch (Exception e)
    {
        Debugger.Error($"Failed to get guild info database: {e}");
        return null;
    }
}

Where 문 우측의 데이터를 지역변수로 선언후 처리하니 정상적으로 동작하는거같네요

좋아요 1

추가적으로 질문 드립니다. 데이터베이스에서 오래된 데이터부터 삭제하는 처리를 하기위해서

 var deleteResult = BackendManager.Instance.DBClient.From<BACKND.Database.Guildlog>()
     .Where(x => x.Guildindate == indate)
     .OrderByDescending(x => x.Timestamp)
     .Skip(guildLogMaxCount - 1)
     .Take(1)
     .Delete();

이런식으로 작성을 했는데 where 문에 일치되는 데이터가 일괄 제거되는것으로 보입니다. delete 사용에서는 skip이나 take 문법이 적용되지 않는지 확인요청드립니다.

문의주신 내용 확인 결과,
현재 사용하신 OrderBy, Skip, Take 를 포함한 구문은 데이터베이스의 조회 기능에서만 지원되는 것으로 확인됩니다.

해당 구문은 Delete() 와 함께 사용할 경우 SDK 내부적으로 정상적으로 처리되지 않고,
Where() 조건까지만 적용된 상태로 삭제가 처리되기 때문에
결과적으로 조건에 일치하는 데이터가 함께 삭제되는 동작이 발생할 수 있습니다.

원하는 단일 행만 삭제하시려는 경우에는,
먼저 Select 를 통해 삭제할 대상 1건을 특정한 뒤,
해당 행의 Id 또는 PrimaryKey 와 같이 단일 행을 식별할 수 있는 값을 기준으로
Delete() 를 처리하는 방식을 권장드립니다.

활동내역을 구현중이라 queue 형태로 처리되는걸 구상하고 있는데 Insert 같은경우 기존 데이터의 마지막에 삽입하는 방식이라 다수유저의 요청에도 동기화 이슈가 덜할거라고 생각중입니다만.
만약 조회후 가장 오래된 데이터의 index를 delete 시키게끔 보낼경우에 다수유저에게서 같은 index의 delete 요청이 올 경우가 발생하지 않을까 싶습니다만 이런경우에 처리할수있는 기능이 별도로 없을까요?

정확한 솔루션 제공을 위해 구현하시고자 하는 기능에 대해 구체적으로 공유해주실 수 있을까요?
개발부서에서 정확한 사용 정보를 확인하고 안내드리고자 합니다.

정리해보면 inc, dec, insert 와 마찬가지로 delete도 동기화로 부터 안전한 옵션이 필요해서 그부분에 대한 구현이 이미 있는지 또는 구현예정이 있는지 알고싶습니다. where 문 뒤에 first나 last 옵션이나 또는 delete 문에도 skip take 옵션이 지원되면 좋을거같은데 해당부분 구현계획이 있을까요?

데이터베이스의 업데이트나 삭제도 동시성 제어 처리가 이루어지고 있습니다.
where 문 뒤에 first나 last 옵션, 또는 delete 문에 skip take 옵션을 지원하는 계획은 현재로서는 없는 상황입니다.

이메일로도 추가 문의해주신 내용이 확인되어 해당 메일을 통해 구현하시고자 하는 컨텐츠와 관련한 정보 전달드리겠습니다.