簡體   English   中英

我可以干運行/ sandbox sql命令嗎?

[英]Can I dry run/sandbox sql commands?

我正在嘗試構建一個小型rails應用程序,以游戲格式向初學者教授sql。 它的一部分是一個命令行,其中的用途試圖解決sql的問題。 在后端我想對測試數據庫運行他們的sql命令,並檢查結果以查看他們的命令是否正確。

我目前的想法是為課程的每個階段創建sqlite數據庫,然后在每個用戶到達該階段時為該數據庫創建該數據庫的副本。

我認為這會奏效,但我擔心效率。

我的問題是,是否有一種有效的方法讓用戶運行SQL命令(包括drop,alter等),獲得結果,但實際上並沒有對db本身進行任何更改,實質上是任意sql命令的干運行。 我熟悉sqlite和postgres但是對其他數據庫開放。

在Postgres中,您可以對最后回滾的 事務做很多事情:

BEGIN;

UPDATE foo ...:
INSERT bar ...;
SELECT baz FROM ...;
CREATE TABLE abc...;   -- even works for DDL statements
DROP   TABLE def...;
ALTER  TABLE ghi ...:

ROLLBACK;   -- !

手冊中的更多內容: BEGIN ROLLBACK

但請注意,有些事情無法回滾。 例如,序列不會回滾。 或者像dblink調用這樣的特殊命令。

並且某些命令無法在與其他人的交易中運行。 比如CREATE DATABASEVACUUM

此外,並發加載可能會產生副作用,例如死鎖。 但不太可能。 您可以根據需要設置事務隔離級別 ,以排除任何副作用(以性能為代價)。

我不會用合理的數據來做這件事。 意外事故的風險太大了。 讓用戶執行任意代碼是一種難以控制的風險。 但對於訓練環境來說,這應該足夠好了。

模板數據庫備份它。 如果出現問題,這是恢復基本狀態的最快方法。 示例(查看最后一章):
截斷Postgres數據庫中的所有表

這也可以用作強力替代方案 :為每個受訓者提供原始的新數據庫。

雖然您可以在事務中運行其代碼,然后嘗試在回滾之前檢查同一事務中的結果,但這會遇到一些挑戰。

首先,如果代碼中有任何錯誤,則事務將中止。 除了“失敗,這是錯誤信息”之外,您將無法說出任何其他信息。 特別是,您將無法在錯誤發生前檢查部分結果。

其次,如果你在一個數據庫中進行並行運行,那么鎖定會讓你感到困惑。 每個會話都將獲得鎖,通常是對元組或整個關系的獨占鎖。 其他會話將阻止等待鎖定。 這意味着您必須連續進行測試運行。 這可能不是您環境中的問題,但需要考慮。

第三,正如Erwin所說,你必須使你的檢查代碼對序列值之類的東西不敏感,因為它們不會在回滾時重置。

出於所有這些原因,我強烈建議:

CREATE DATABASE course_username_lesson TEMPLATE course_lesson OWNER username;

...或者省略模板數據庫的使用,只需讓你的Rails應用程序使用每個用戶的遷移設置一個空白數據庫。 這可能更簡單,因為這意味着您不必維護模板DB。

PostgreSQL服務器對數百個數據庫非常滿​​意,至少如果預計它不會在峰值生產負載下執行。

您可能需要查看http://sqlfiddle.com/以及許多其他現有的基於Web的SQL編輯器/培訓工具,其中許多是開源的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM