批处理/批量SQL插入到废管道中[PostgreSQL]

2024-06-26 17:47:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用我自己的管道将报废的项目存储到PostgreSQL数据库中,几天前我进行了扩展,现在我将数据存储到3个数据库中。所以,我想做一个管道,每100个条目插入一个要调用的数据,或者它取这些条目,然后100×100地插入它们。在

我想让它在数据库服务器上更快更省事的原因。在


Tags: 数据项目服务器数据库管道postgresql条目原因
3条回答

我不知道scrapy是否内置了任何类型的队列功能,但是也许你可以把你的查询推到scrapy的standard python Queue上,然后让一个消费者监视队列,一旦其中有100个项目,就全部执行,这确实可以由psycopg2来完成(参见psycopg2: insert multiple rows with one query)。在

你可以做些像

queryQueue = Queue()
def queryConsumer(){
    while True:
    if queryQueue.qsize()==100:
        queries=[queryQueue.get() for i in range(100)]            
        #execute the 100 queries
}
t = Thread(target=queryConsumer)
t.daemon = True
t.start()

从你那恶心的方法你可以

^{pr2}$

将项目推送到队列中。在

答案和阿南德哈库马尔的回答没有什么不同 我用setter和getter方法在settings文件中创建了一个全局列表

# This buffer for the bluk insertion
global products_buffer

products_buffer = []

# Append product to the list
def add_to_products_buffer(product):
  global products_buffer
  products_buffer.append(product)

# Get the length of the product
def get_products_buffer_len():
  global products_buffer
  return len(products_buffer)

# Get the products list
def get_products_buffer():
  global products_buffer
  return products_buffer

# Empty the list
def empty_products_buffer():
  global products_buffer
  products_buffer[:] = []

然后我把它导入管道

^{pr2}$

每次调用管道时,我都会把这个项目附加到列表中,我检查列表的长度是否为100,我在列表上循环以准备许多插入请求,但最重要的魔法是在一行中提交它们,不要在循环中提交,否则您将得不到任何东西,而且要将它们全部插入需要很长时间。在

def process_item(self, item, spider):  
    # Adding the item to the list
    add_to_products_buffer(item)
    # Check if the length is 100
    if get_products_buffer_len() == 100:
        # Get The list to loop on it
        products_list  = get_products_buffer()
        for item in products_list:
            # The insert query
            self.cursor.execute('insert query')
        try:
            # Commit to DB the insertions quires 
            self.conn.commit()
            # Emty the list
            empty_products_buffer()
        except Exception, e:
            # Except the error

如果不想循环,也可以使用executemany。在

这不是一个废弃的选项,而是一个用于大容量插入行的psycopg2选项。 这个问题有您可以使用的选项: Psycopg2, Postgresql, Python: Fastest way to bulk-insert

相关问题 更多 >