python - फ्लास्क-एसक्यूएललेमी के साथ थोक आवेषण




flask sqlalchemy (2)

मैं फ्लास्क-एसक्यूएलकेमी का उपयोग कर रहा हूं ताकि 60k पंक्तियों के एक बड़े बल्क डालें। इस मेज पर मेरे पास कई-से-कई रिश्ते हैं, इसलिए मैं db.engine.execute लिए db.engine.execute उपयोग नहीं कर सकता। सम्मिलित करने से पहले, मुझे डेटाबेस में समान आइटम ढूंढने की आवश्यकता है, और डुप्लिकेट आइटम मिल जाने पर अपडेट को डालने की आवश्यकता है।

मैं पहले से यह चेक कर सकता था, और फिर db.engine.execute माध्यम से एक बल्क डालें, लेकिन मुझे प्रविष्टि पर पंक्ति की प्राथमिक कुंजी की आवश्यकता है।

वर्तमान में, मैं प्रत्येक प्रविष्टि पर एक db.session.add() और db.session.commit() कर रहा हूं, और मुझे प्रति सेकंड 3-4 आवेषण मिलते हैं।

मैं एक प्रोफ़ाइलर चला गया जहां देखने के लिए बाधा है, और ऐसा लगता है कि db.session.commit() समय का 60% ले रहा है

क्या कोई ऐसा तरीका है जो मुझे इस ऑपरेशन को तेजी से बनाने की इजाजत देता है, संभवत: कमेटी के समूह द्वारा, लेकिन मुझे प्राथमिक कुंजी वापस कौन देगा?

मेरे मॉडल इस तरह दिखते हैं:

class Item(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(1024), nullable=True)
    created = db.Column(db.DateTime())
    tags_relationship = db.relationship('Tag', secondary=tags, backref=db.backref('items', lazy='dynamic'))
    tags = association_proxy('tags_relationship', 'text')

class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
text = db.Column(db.String(255))

मेरा सम्मिलन ऑपरेशन इस तरह चलाया जाता है:

for item in items:
    if duplicate:
        update_existing_item
    else:
        x = Item()
        x.title = "string"
        x.created = datetime.datetime.utcnow()
        for tag in tags:
            if not tag_already_exists:
                y = Tag()
                y.text = "tagtext"
                x.tags_relationship.append(y)
                db.session.add(y)
                db.session.commit()
            else:
                x.tags_relationship.append(existing_tag)
    db.session.add(x)
    db.session.commit()

SQLite में पेंडस डेटाफ़्रेम की सामग्री को जल्दी से पढ़ने के लिए मैं निम्नलिखित कोड का उपयोग करता हूं ध्यान दें कि यह SQLAlchemy के ORM विशेषताओं को खारिज कर देता है इस संदर्भ में myClass एक डीबी है। मॉडेल व्युत्पन्न वर्ग जिसे उसके पास एक टेबल नाम दिया गया है। जैसे कोड स्निपेट्स का उल्लेख है, मैं अनुकूलित हूं

l = df.to_dict('records')
# bulk save the dictionaries, circumventing the slow ORM interface
# c.f. https://gist.github.com/shrayasr/5df96d5bc287f3a2faa4
connection.engine.execute(
    myClass.__table__.insert(),
    l
)

शायद आपको डेटा को सर्वर पर भेजने के लिए db.session.flush() करने का प्रयास करना चाहिए, जिसका अर्थ है कि कोई प्राथमिक कुंजी उत्पन्न हो जाएगी। अंत में आप वास्तव में लेनदेन करने के लिए db.session.commit() कर सकते हैं।







flask-sqlalchemy