मेरी पिछली पोस्ट को जारी रखें मैं वस्तुओं की सूची के लिए बल्क_सेव_ऑब्जेक्ट्स का उपयोग करने की कोशिश कर रहा हूं (ऑब्जेक्ट्स में पीके मान नहीं है इसलिए इसे प्रत्येक ऑब्जेक्ट के लिए बनाना चाहिए)। जब मैं बल्क_सेव_ऑब्जेक्ट्स का उपयोग करता हूं तो मुझे सभी ऑब्जेक्ट्स के लिए एक इंसर्ट के बजाय प्रति ऑब्जेक्ट एक इंसर्ट दिखाई देता है।

कोड :

class Product(Base):

    __tablename__ = 'products'
    id = Column('id',BIGINT, primary_key=True)
    barcode = Column('barcode' ,BIGINT)
    productName = Column('name', TEXT,nullable=False)
    objectHash=Column('objectHash',TEXT,unique=True,nullable=False)

    def __init__(self, productData,picture=None):
        self.barcode = productData[ProductTagsEnum.barcode.value]
        self.productName = productData[ProductTagsEnum.productName.value]
        self.objectHash = md5((str(self.barcode)+self.produtName).encode('utf-8')).hexdigest()

एक अन्य वर्ग में निम्नलिखित सहेजने की विधि है:

def saveNewProducts(self,products):
    Session = sessionmaker()
    session=Session()
    productsHashes=[ product.objectHash for product in products]
    query = session.query(Product.objectHash).filter(Product.objectHash.in_(productsHashes))
    existedHashes=query.all()
    newProducts = [ product for product in products if product.objectHash not in productsHashes]
    /*also tried : session.bulk_save_objects(newProducts, preserve_order=False)*/

    session.bulk_save_objects(newProducts)

1 अपडेट करें

मैं टिप्पणियों में @Ilja Everilä की सिफारिश का अनुसरण कर रहा हूं, मैंने कनेक्शन स्ट्रिंग में कुछ पैरामीटर जोड़े हैं:

 engine = create_engine('postgresql://postgres:123@localhost:5432/mydb', pool_size=25, max_overflow=0,
                           executemany_mode='values',
                           executemany_values_page_size=10000, executemany_batch_page_size=500,
                           echo=True)

कंसोल में मैंने निम्नलिखित प्रारूप के साथ कई प्रविष्टियां देखीं:

2019-09-16 16:48:46,509 INFO sqlalchemy.engine.base.Engine INSERT INTO products (barcode, productName, objectHash) VALUES (%(barcode)s, %(productName)s, %(objectHash)s, ) RETURNING products.id
2019-09-16 16:48:46,509 INFO sqlalchemy.engine.base.Engine {'barcode': '5008251', 'productName': 'ice ream','object_hash': 'b2752233ec523f2e874dc95b70020ae5'}
4
JeyJ 16 सितंबर 2019, 10:21

1 उत्तर

सबसे बढ़िया उत्तर

मेरे मामले में, मैंने जिस समाधान का उपयोग किया: मैंने आईडी कॉलम हटा दिया और ऑब्जेक्ट हैश को पीके के रूप में सेट किया, और बाद में save_bulk और add_all फ़ंक्शन काम किया और वास्तव में बल्क इंसर्ट किया। ऐसा लगता है कि वे फ़ंक्शन तभी काम करते हैं जब आपके पास ऑब्जेक्ट के अंदर पहले से ही pk हो।

0
halfer 19 पद 2020, 20:03