3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
表名不能作為參數(shù)傳遞,但其他所有參數(shù)都可以。因此,表名應(yīng)該在您的應(yīng)用程序中進(jìn)行硬編碼(不要接受輸入或使用程序外的任何東西作為名稱)。您擁有的代碼應(yīng)對(duì)此起作用。
如果您有合理的理由使用外部表名稱,請(qǐng)確保您不允許用戶直接輸入該名稱。也許可以傳遞索引來(lái)選擇表,或者可以通過(guò)其他方式查找表名。但是,您應(yīng)該對(duì)此保持謹(jǐn)慎。之所以可行,是因?yàn)楸砻鄬?duì)較少。找到一種驗(yàn)證表名的方法,您應(yīng)該會(huì)很好。
可以執(zhí)行類似的操作來(lái)查看表名稱是否存在。這是參數(shù)化版本。只需確保執(zhí)行此操作并在運(yùn)行SQL代碼之前驗(yàn)證輸出即可。對(duì)此的部分想法來(lái)自此答案。
SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' and table_name=%s LIMIT 1

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊
根據(jù)此答案,您可以這樣做:
import psycopg2
from psycopg2.extensions import AsIs
#Create your connection and cursor...
cursor.execute("SELECT * FROM %(table)s", {"table": AsIs("my_awesome_table")})
- 3 回答
- 0 關(guān)注
- 1130 瀏覽
添加回答
舉報(bào)