slouchpie

slouchpie

Updating money amount in database using `:inc`

@kip You might know if this is possible or not.

I have been experimenting with different ways of updating a balance field in the database that is of the usual Money type.

Consider this:

    Multi.update_all(
      multi,
      :wallet,
      fn _ ->
        from(w in Wallet,
          where: w.id == ^wallet_id,
          update: [inc: [balance: type(^amount, ^Money.Ecto.Composite.Type.cast_type())]]
        )
      end,
      []
    )

This results in an error:

     ** (Postgrex.Error) ERROR 42883 (undefined_function) operator does not exist: money_with_currency + money_with_currency
     
         query: UPDATE "wallets" AS w0 SET "balance" = w0."balance" + $1::money_with_currency WHERE (w0."id" = $2)
     
         hint: No operator matches the given name and argument types. You might need to add explicit type casts.

I have run the “aggregate functions for money” migration although I didn’t think it would help since this is +, not sum.

I think maybe this kind of syntax just isn’t possible? Can anyone confirm?

Marked As Solved

kip

kip

ex_cldr Core Team

I’ve just published ex_money_sql version 1.5.0 that adds support for the Postgres + operator for :money_with_currency types. I believe that will also support the query you described above.

To install the required functions in Postgres the readme now says:

Plus operator +

ex_money defines a migration generator which, when migrated to the database with mix ecto.migrate, supports the + operator for :money_with_currency columns. The steps are:

  1. Generate the migration by executing mix money.gen.postgres.plus_operator

  2. Migrate the database by executing mix ecto.migrate

  3. Formulate an Ecto query to use the + operator

  iex> q = Ecto.Query.select Item, [l], type(fragment("price + price"), l.price)
  #Ecto.Query<from l0 in Item, select: type(fragment("price + price"), l0.price)>
  iex> Repo.one q
  [debug] QUERY OK source="items" db=5.6ms queue=0.5ms
  SELECT price + price::money_with_currency FROM "items" AS l0 []
  #Money<:USD, 200>]

Let me know if you have any feedback and please file any bugs on the issue tracker.

12
Post #1

Also Liked

kip

kip

ex_cldr Core Team

Good to hear! Was a fun Saturday morning puzzle for me. And always good to be reminded how amazing Postgres is!

kip

kip

ex_cldr Core Team

ex_money_sql is the library that implements database support for Money.t types. After that, its Postgres (or MySQL potentially or some other database) that is doing all the work.

The + operator can be overloaded in Postgres and the implementation of that for a :money_with_currency type is here

Last Post!

slouchpie

slouchpie

Did you try the code in my OP?

I don’t have source code for it any more - we transitioned to eventsourcing (commanded lib) for our wallets stuff.

Where Next?

Trending in Questions Top

lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" =&gt; #BSON.ObjectId&lt;58eb1a7a9ad169198c3dXXXX&gt;, "email" =&gt; ...
New
tj0
I’ve been following the steps here for the upgrade from 1.6 to 1.7 and it has gone relatively smoothly all the way till the phoenix_view ...
New
cgraham
Hi! What is currently the best library/method for parsing text and tabular data out of PDF files in Elixir or Erlang?
New
stefanchrobot
Hi, I need a way to handle data migrations in my application. I found an article by @wojtekmach about manual migrations: Automatic and ma...
New
stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
kip
Localize is the next generation localisation library for Elixir. Think of it as ex_cldr version 3.0. The first version will be released ...
New
webofbits
Squid Mesh is an open source workflow automation runtime for Elixir applications. It is aimed at Phoenix and OTP apps that want to defin...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
kip
In 2021 I started a new library called Tempo with the objective of modelling time as a set of intervals - not as instants. In 2022 I gave...
New

We're in Beta

About us Mission Statement