Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

तालिका के साथ बैच सम्मिलित करें जिसमें Anorm . का उपयोग करके कई कॉलम हैं

मैं विकल्प बी के साथ जाऊंगा। मैं BatchSql . से बहुत परिचित नहीं हूं आखिरी बार मैंने जांच की कि यह अनुक्रम में प्रश्नों के नाव लोड को निष्पादित करता है, जो बहुत धीमा है। मैं सब कुछ एक ही प्रश्न में एकत्रित करने की अनुशंसा करता हूं। यह थोड़ा अधिक कठिन है, लेकिन एक हजार इंसर्ट की तुलना में एक हजार इंसर्ट के साथ एक क्वेरी को निष्पादित करने के लिए बहुत तेज है।

सुविधा के लिए, मान लें कि आपके पास Seq है का

case class Test(val1: Int, val2: Option[Long], val3: Option[String])

तब आप अपनी क्वेरी इस तरह बना सकते हैं:

val values: Seq[Test] = Seq(....)

/* Index your sequence for later, to map to inserts and parameters alike */
val indexedValues = values.zipWithIndex

/* Create the portion of the insert statement with placeholders, each with a unique index */
val rows = indexValues.map{ case (value, i) =>
    s"({val1_${i}}, {val2_${i}}, {val3_${i}})"
}.mkString(",")

/* Create the NamedParameters for each `value` in the sequence, each with their unique index in the token, and flatten them together */
val parameters = indexedValues.flatMap{ case(value, i) =>
    Seq(
        NamedParameter(s"val1_${i}" -> value.val1),
        NamedParameter(s"val2_${i}" -> value.val2),
        NamedParameter(s"val3_${i}" -> value.val3)
    ) 
}

/* Execute the insert statement, applying the aggregated parameters */
SQL("INSERT INTO table1 (col1, col2, col3) VALUES " + rows)
    .on(parameters: _ *)
    .executeInsert()

नोट:

आपको यह जांचना होगा कि values आगे बढ़ने से पहले गैर-रिक्त है, क्योंकि यदि यह होता तो यह एक अमान्य SQL कथन उत्पन्न करता।

आप कितनी पंक्तियों और स्तंभों को सम्मिलित कर रहे हैं, इस पर निर्भर करते हुए, अंततः टोकन पार्सर्स जिन्होंने तैयार कथन बनाया है, टोकन की भारी मात्रा से पार्स (और स्ट्रिंग आकार) तक धीमा हो जाएगा। मैंने इसे कई स्तंभों के साथ कुछ सौ पंक्तियों के बाद देखा है। इसे कुछ हद तक कम किया जा सकता है। स्काला के दृढ़ता से टाइप की जाने वाली भाषा होने के लिए धन्यवाद, Int और Long SQL इंजेक्शन के लिए कोई खतरा नहीं है। आप केवल उन कॉलम के लिए स्ट्रिंग इंटरपोलेशन/कॉन्सटेनेशन का उपयोग करके अपने एसक्यूएल स्टेटमेंट तैयार कर सकते हैं और असुरक्षित कॉलम को NamedParameter से बांध सकते हैं। सामान्य रूप से। इससे पार्स किए जाने वाले टोकन की संख्या कम हो जाएगी।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटा तालिका इनपुट सर्वर से JSON डेटा से होने पर Google चार्ट बार रंग बदलें

  2. MySQL:जॉइन या यूनियन के बिना दो अलग-अलग टेबल मर्ज करें

  3. अधिसूचना के लिए हर सेकेंड क्वेरी तालिका। क्या यह एक अच्छा अभ्यास है?

  4. Laravel प्रत्येक समूह के लिए नवीनतम रिकॉर्ड प्राप्त करें

  5. MySQL, X के अंतिम घंटों के भीतर सभी परिणाम लौटाएं