Git Product home page Git Product logo

Comments (2)

zombiezen avatar zombiezen commented on May 26, 2024

When directly preparing a statement, the resulting Stmt has column-index based setters and Named arg based setters, but neither allow for specifying a row number (and the underlying structures are 1-dimensional).

When using sqlitex Execute or ExecuteTransient functions, the ExecOptions only has 1-dimensional Args and Named fields.

Your understanding is correct and matches what SQLite provides.

I can generate a giant SQL statement directly with no arguments that has multiple rows in VALUES and call ExecuteTransient, but it doesn't benefit from being a prepared statement and I need to do it millions of times.

You can do an INSERT with parameters too:

INSERT INTO foo ( "id" ) VALUES (:row1_id), (:row2_id), (:row3_id);

Am I missing something here?

A couple things, perhaps:

  • You can reuse the same prepared statement with Stmt.Reset and Stmt.ClearBindings to run a single-row insert multiple times. This avoids having to re-parse the SQL statement, and is a fairly common way of inserting a lot of data at once.
  • If you are performing data modification outside of an explicit transaction (autocommit mode), SQLite will wrap each statement in an implicit transaction. By default, this has the side-effect of performing a full fsync on each commit, which will be very slow. You likely want to start a transaction, perform all your inserts, then commit the transaction.

from go-sqlite.

shaunco avatar shaunco commented on May 26, 2024

Much appreciated! The INSERT example you provided would only work with a single column data, as far as I can see there is no way to replace :row1_id with multiple columns worth of data.

I'll do some performance testing, but it looks like using a SAVEPOINT or TRANSACTION around a bunch of INSERTs through a prepared statement will be the way to go.

from go-sqlite.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.