gpt4 book ai didi

python sqlalchemy bulk_save_objects 不使用批量

转载 作者:太空狗 更新时间:2023-10-30 01:58:06 28 4
gpt4 key购买 nike

继续我的previous post我正在尝试将 bulk_save_objects 用于对象列表(对象没有 PK 值,因此它应该为每个对象创建它)。当我使用 bulk_save_objects 时,我看到每个对象都有一个插入,而不是所有对象都有一个插入。

代码:

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'}

最佳答案

在我的例子中,我使用的解决方案:我删除了 id 列并将 objectHash 设置为 PK,然后 save_bulk 和 add_all 函数起作用并且实际上进行了批量插入。似乎这些函数只有在对象内部已经有 pk 时才有效。

关于python sqlalchemy bulk_save_objects 不使用批量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57952089/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com