On 01/24/2017 07:40 PM, Robert Sami wrote:
Thanks for the response Mike,
I agree that using Core is pretty clean. One approach I considered was
the following:
```
res = conn.execute(FooBase.__table__.insert(returning=[FooBase.id],
values=[{} for i in range(100000)]))
conn.execute(FooDerived.__table__.insert(values=[{'id': _id, data:
'whatever'} for _id, in res.fetchall()]))
```
This is similar to the approach you outlined above, but also robust to
other transactions inserting in the table.
OK, so usually RETURNING doesn't work for "executemany()", but I see
there you are packing them into one big VALUES clause and ultimately
using cursor.execute(), so that should work, though you want to chunk
the sizes into batches of 1000 or so or your SQL statement will grow too
large.
The reason I would prefer to use `session.bulk_save_objects()` is that
this method is aware of default attribute values of objects. For example:
```
class FooDerived(..):
...
data = db.Column(db.Integer, default=17)
that "default" is interpreted by the Core, not the ORM. So your core
statement should handle it too and you'd see those "17"s going in. If
not, let's get an MCVE and figure out why.
```
Creating a bunch of `FooDerived` objects will automatically set the
`data` attributes to their default value. So I was hoping there was some
way of using `session.bulk_save_objects()` to a similar effect as the
Core approach I shared above, which uses a "RETURNING" clause to know
the primary keys of the newly inserted `FooBase` rows. If not, do you
have any other thoughts or suggestions on how to get the best of both
worlds?
Many thanks!
On Tue, Jan 24, 2017 at 3:00 PM, mike bayer <[email protected]
<mailto:[email protected]>> wrote:
On 01/24/2017 04:49 PM, Robert Sami wrote:
Hi SQLAlchemy wizards.
I was interested in using the new bulk operations API
(http://docs.sqlalchemy.org/en/latest/orm/persistence_techniques.html#bulk-operations
<http://docs.sqlalchemy.org/en/latest/orm/persistence_techniques.html#bulk-operations>)
but was looking for some advice based on my use case.
I have a class “FooDerived” which corresponds to a table that is
linked
to “FooBase” using joined table inheritance. I want to use the
bulk_save_objects method to save, lets say 100,000 instances of
“FooDerived”.
One option would be the following:
```
session.bulk_save_objects([FooBase() for i in range(100000)])
session.flush()
foo_base_models = FooBase.query.filter(/* Assume its possible to
filter
for the newly created objects*/).all()
session.bulk_save_objects([FooDerived(id=base.id
<http://base.id>) for base in
foo_base_models])
```
Is there a better way?
this would be expressed much more clearly and efficiently using Core
constructs, and you need a way of knowing that primary key for
FooBase() because how you have it above where it auto-generates the
primary key, it would perform 100K SELECT statements :
foobase = FooBase.__table__
fooderived = FooDerived.__table__
with engine.begin() as conn:
my_first_pk = conn.scalar(select([func.max(foobase.c.id
<http://foobase.c.id>)]))
conn.execute(
foobase.insert(),
{"id": ident + my_first_pk, "data": "whatever"} for ident in
range(100000)
)
conn.execute(
fooderived.insert(),
{"id": ident + my_firstpk, "data": "whatever"} for ident in
range(100000)
)
of course you need to make sure no other transactions are INSERTing
rows with this approach or they will throw off your primary key counter.
Thank you!
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and
Verifiable Example. See http://stackoverflow.com/help/mcve
<http://stackoverflow.com/help/mcve> for a full
description.
---
You received this message because you are subscribed to the Google
Groups "sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from
it, send
an email to [email protected]
<mailto:sqlalchemy%[email protected]>
<mailto:[email protected]
<mailto:sqlalchemy%[email protected]>>.
To post to this group, send email to [email protected]
<mailto:[email protected]>
<mailto:[email protected]
<mailto:[email protected]>>.
Visit this group at https://groups.google.com/group/sqlalchemy
<https://groups.google.com/group/sqlalchemy>.
For more options, visit https://groups.google.com/d/optout
<https://groups.google.com/d/optout>.
--
SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and
Verifiable Example. See http://stackoverflow.com/help/mcve
<http://stackoverflow.com/help/mcve> for a full description.
--- You received this message because you are subscribed to a topic
in the Google Groups "sqlalchemy" group.
To unsubscribe from this topic, visit
https://groups.google.com/d/topic/sqlalchemy/MpC7I2WV4aM/unsubscribe
<https://groups.google.com/d/topic/sqlalchemy/MpC7I2WV4aM/unsubscribe>.
To unsubscribe from this group and all its topics, send an email to
[email protected]
<mailto:sqlalchemy%[email protected]>.
To post to this group, send email to [email protected]
<mailto:[email protected]>.
Visit this group at https://groups.google.com/group/sqlalchemy
<https://groups.google.com/group/sqlalchemy>.
For more options, visit https://groups.google.com/d/optout
<https://groups.google.com/d/optout>.
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and
Verifiable Example. See http://stackoverflow.com/help/mcve for a full
description.
---
You received this message because you are subscribed to the Google
Groups "sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to [email protected]
<mailto:[email protected]>.
To post to this group, send email to [email protected]
<mailto:[email protected]>.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable
Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to the Google Groups "sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.