亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

可變表名。

可變表名。

慕后森 2019-07-05 15:27:33
可變表名。問:不需要使用字符串構造函數就可以使用變量作為表名嗎?信息:我現在正在做一個項目,這個項目記錄了我的模擬星圖中的數據。為此,我將把所有數據加載到sqite數據庫中。它運行得很好,但是我決定給我的數據庫增加更多的靈活性、效率和可用性。我計劃稍后在模擬中加入行星,并希望為每一顆恒星提供一張桌子。這樣的話,我就不用去查詢每一個太陽系中有2000萬個行星的表了。有人告訴我,使用字符串構造函數是不好的,因為它使我容易受到SQL注入攻擊。雖然這不是什么大問題,因為我是唯一能夠訪問這些DBS的人,我想遵循最佳實踐。也是這樣,如果我做一個類似的項目,它是向公眾開放的,我知道該做什么。目前我正在做這件事:cursor.execute("CREATE TABLE StarFrame"+self.name+" (etc etc)")這是可行的,但我想做的更像:cursor.execute("CREATE TABLE StarFrame(?) (etc etc)",self.name)雖然我知道這可能是不可能的。雖然我會滿足于cursor.execute("CREATE TABLE (?) (etc etc)",self.name)如果這是不可能的,我會接受這個答案,但如果有人知道如何做到這一點,請告訴。*)我在用python編碼。
查看完整描述

3 回答

?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

對于那些尋找將表作為變量的方法的人,我從對同一個問題的另一個回答中得到了這個結果。這里:

它說了下面的話,它起作用了。所有這些都是引用自馬霍克:

不能使用參數替換表名。您需要自己將表名添加到查詢字符串中。就像這樣:

query = 'SELECT * FROM {}'.format(table)c.execute(query)

需要注意的一件事是表名的值的來源。如果這來自不受信任的源(例如用戶),則需要驗證表名以避免潛在的SQL注入攻擊。一種方法可能是構造一個參數化查詢,從DB目錄中查找表名:

import sqlite3def exists_table(db, name):
    query = "SELECT 1 FROM sqlite_master WHERE type='table' and name = ?"
    return db.execute(query, (name,)).fetchone() is not None


查看完整回答
反對 回復 2019-07-05
  • 3 回答
  • 0 關注
  • 496 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號