On Mon, Sep 3, 2018 at 4:17 AM Chris Angelico <ros...@gmail.com> wrote:

> On Mon, Sep 3, 2018 at 5:23 PM, Jacco van Dorp <j.van.d...@deonet.nl>
> wrote:
> > This feels really useful to me to make some quick changes to a database -
> > perhaps a database layer could return an class of type Recordclass, and
> then
> > you just simply mutate it and shove it back into the database.
> Pseudocode:
> >
> > record = database.execute("SELECT * FROM mytable WHERE primary_key = 15")
> > record.mostRecentLoggedInTime = time.time()
> > database.execute(f"UPDATE mytable SET mostRecentLoggedInTime =
> > {record.mostRecentLoggedInTime} WHERE primary_key =
> {record.primary_key}":)
> >
> > Or any smart database wrapper might just go:
> >
> > database.updateOrInsert(table = mytable, record = record)
> >
> > And be smart enough to figure out that we already have a primary key
> unequal
> > to some sentinel value like None, and do an update, while it could do an
> > insert if the primary key WAS some kind of sentinel value.
>
> In its purest form, what you're asking for is an "upsert" or "merge"
> operation:
>
> https://en.wikipedia.org/wiki/Merge_(SQL)
>
> In a multi-user transactional database, there are some fundamentally
> hard problems to implementing a merge. I'm not 100% certain, so I
> won't say "impossible", but it is certainly *extremely difficult* to
> implement an operation like this in application-level software without
> some form of race condition.
>

http://docs.sqlalchemy.org/en/latest/orm/contextual.html#contextual-thread-local-sessions
- scoped_session

http://docs.sqlalchemy.org/en/latest/orm/session_state_management.html#merging

http://docs.sqlalchemy.org/en/latest/orm/session_basics.html

obj = ExampleObject(attr='value')
assert obj.id is None
session.add(obj)
session.flush()
assert obj.id is not None
session.commit()
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to