in sequelize (javascript) it’s pretty straightforward to either find a record, or create it if it doesn’t exist. I don’t see anything similar with sea-orm. There’s a ‘save’ method that seems to insert or update, but I need to know details about the record ahead of time :/

Any ideas?

https://sequelize.org/docs/v6/core-concepts/model-querying-finders/

  • @Lmaydev
    link
    29 months ago

    I would likely do it in reverse. Try and find the object and if it doesn’t exist create it.

    • @snaggen
      link
      49 months ago

      That will always be prune to race conditions, where you check if someting exists (then some other thread creates it) and then you try to create it. You should always try to create first, then if it fails due to it already existing, fetch it. That is a good general rule for anything from hashmaps to databases.

      • @[email protected]
        link
        fedilink
        39 months ago

        That’s true, but also trying to create first has a race condition too. The above code will panic at the unwrap if the record is deleted after the failed insert, and before the select

        • @snaggen
          link
          29 months ago

          So, a loop it is…

      • @nerdbloodOP
        link
        19 months ago

        I’m new to multithreaded programming. How would some other thread create it? Like what’s the real-world scenario?

        • @snaggen
          link
          English
          29 months ago

          That is all dependent on the program, but the simplest scenario is by an API with two requests at the same time. But it may also be like if you scan for new files, and use inotify, then you may also have a scanning loop as a fallback. Then the scan and inotify may trigger at almost the same time, so if that then results in a db create or insert you can get in to this problem. So, there are multiple ways to get in to trouble, and life always find new ways 😀

          • @nerdbloodOP
            link
            19 months ago

            Indeed it does haha, thanks