sql >> Database teknologi >  >> RDS >> Mysql

Slick 3.0 masseindsættelse eller opdatering (upsert)

Der er flere måder, hvorpå du kan gøre denne kode hurtigere (hver enkelt bør). være hurtigere end de foregående, men det bliver gradvist mindre idiomatisk glat):

  • Kør insertOrUpdateAll i stedet for insertOrUpdate hvis på slick-pg 0.16.1+

    await(run(TableQuery[FooTable].insertOrUpdateAll rows)).sum
    
  • Kør dine DBIO-begivenheder på én gang i stedet for at vente på, at hver enkelt forpligter sig, før du kører den næste:

    val toBeInserted = rows.map { row => TableQuery[FooTable].insertOrUpdate(row) }
    val inOneGo = DBIO.sequence(toBeInserted)
    val dbioFuture = run(inOneGo)
    // Optionally, you can add a `.transactionally`
    // and / or `.withPinnedSession` here to pin all of these upserts
    // to the same transaction / connection
    // which *may* get you a little more speed:
    // val dbioFuture = run(inOneGo.transactionally)
    val rowsInserted = await(dbioFuture).sum
    
  • Gå ned til JDBC-niveauet og kør din upsert på én gang (idé via dette svar ):

    val SQL = """INSERT INTO table (a,b,c) VALUES (?, ?, ?)
    ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);"""
    
    SimpleDBIO[List[Int]] { session =>
      val statement = session.connection.prepareStatement(SQL)
      rows.map { row =>
        statement.setInt(1, row.a)
        statement.setInt(2, row.b)
        statement.setInt(3, row.c)
        statement.addBatch()
      }
      statement.executeBatch()
    }
    


  1. Oracle Indekser og typer af indekser i Oracle med eksempel

  2. Sådan rettes forespørgselsgruppe med only_full_group_by

  3. Sådan håndhæves char(N)-datatype i stedet for varchar(N) i django-modelfeltet

  4. Opsætning af Django og PostgreSQL på to forskellige EC2-instanser