2017-05-24 29 views
0

在Ruby中,有上,將有一個字符串和參數的字符在該字符串,這樣可以在URL中使用的字符串對象非常有用的功能。即:PostgreSQL中是否有像Ruby中的參數化函數?

2.2.2 :001 > "Rising Star".parameterize 
    => "rising-star" 

是否有SQL同等功能,這將在一根繩子上執行同樣的功能?

使用案例:

我需要寫一個SQL腳本,會做一些這樣的:

UPDATE companies SET unique_permalink = id + name; 

如果有SQL中的參數化功能,我希望我可以做到以下幾點:

UPDATE companies SET unique_permalink = id + parameterize(name); 

但是,我找不到任何一種功能,將執行我需要它執行的操作。在誰能幫我解決問題之前,有沒有人處理過這個挑戰?

很多感謝朋友們!

+1

Ruby有功能,那麼爲什麼在Ruby中無法做到這一點?你的Postgres可能有V8的支持,所以你可以理論上*將它移植到JavaScript,如果你想,但這聽起來像很多工作。 – tadman

+1

我確實有一個腳本可以在Ruby中執行此功能,但是,此腳本將花費大於12小時的時間在我的生產數據集上運行。我在很多項目上看到過這個問題,並且寧願創建更快的SQL腳本/命令以儘可能快地獲取生產數據集以清理狀態。 Ruby腳本很棒,但是當你有一個ORM位於數據庫上時,它實際上相對於低級別的數據庫腳本來說非常慢。我真的想找到解決這個問題的方法。 –

+0

據我所知Postgresql沒有這樣的本地函數,但你可以通過使用拼接和正則表達式替換函數來模仿它。 – nicholasnet

回答

0

所以,我發現這個問題的解決方案是不是100%我一直在尋找的答案,但是,它在任何替代方案,我可以找到或計算出一個巨大的性能提升。

connection = ActiveRecord::Base.connection 
Company.all.find_in_batches do |companies| 
    cases = companies.map{|c| "UPDATE companies set unique_permalink = {c.id}-#{c.name.parameterize}' where id = #{c.id}"} 
    query = cases.join('; ') 
    connection.execute(query) 
end 

這種解決方案的性能提升來自於一個SQL語句查詢批處理的巨量。這是非常高效的,並採取了一個大的過程,並使其超快。希望這可以幫助那裏的人。

相關問題