簡體   English   中英

python mysqldb 中的 escaping 單引號

[英]escaping single quotes in python mysqldb

這似乎是編程中的一個典型問題,但我在谷歌中沒有發現任何有用的東西。 這是代碼:

 file=open('list.txt','r') for line in file: cursor.execute("CREATE TABLE IF NOT EXISTS \ %s(id INT(2) NOT NULL PRIMARY KEY AUTO_INCREMENT, \ entry TEXT NOT NULL)" % line) file.close() cursor.close() db.close()

這是我嘗試使用單引號創建表時的錯誤:

 Traceback (most recent call last): File "test.py", line 104, in <module> entry TEXT NOT NULL)" % line) File "/usr/lib/pymodules/python2.7/MySQLdb/cursors.py", line 166, in execute self.errorhandler(self, exc, value) File "/usr/lib/pymodules/python2.7/MySQLdb/connections.py", line 35, in defaulterrorhandler raise errorclass, errorvalue _mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Hi 'Buddy,(id INT(2) NOT NULL PRIMARY KEY AUTO_INCREMENT, entry ' at line 1")

MySQLdb.escape_string(line)順便別修

afaik(請參閱此處的 MySQL 5.0 參考)您不允許在表名中使用單引號:

不帶引號的標識符中允許的字符:

 ASCII: [0-9,az,AZ$_] (basic Latin letters, digits 0-9, dollar, underscore) Extended: U+0080.. U+FFFF

我不確定您為什么要這樣做,我認為我應該建議重新考慮您的架構,但是您可以使用反引號`轉義表名。

# notice the `'s surrounding %s
for line in file:
    cursor.execute("CREATE TABLE IF NOT EXISTS \
    `%s`(id INT(2) NOT NULL PRIMARY KEY AUTO_INCREMENT, \
    entry TEXT NOT NULL)" % line)

嘗試這個 -

cursor.execute("CREATE TABLE IF NOT EXISTS '%s'(id INT(2) NOT NULL PRIMARY KEY AUTO_INCREMENT, entry TEXT NOT NULL)" % line)

不要使用 % 格式來輸入值,而是將您的語句傳遞給cursor.execute()對於您需要替換的每個值,其中仍然包含%s ,並將所有替換值的列表或元組作為您的第二個參數,對於例子:

stmt = "CREATE TABLE IF NOT EXISTS %s(id INT(2) NOT NULL PRIMARY KEY AUTO_INCREMENT, entry TEXT NOT NULL)"
value_list = [line]
cursor.execute(stmt, value_list)

這將為您執行所有必要的 escaping 因為它會將您的字符串轉換為有效的 SQL 文字。 這直接來自MySQLdb User's Guide ,下面是相關示例:

要執行查詢,您首先需要一個 cursor,然后您可以對其執行查詢:

 c=db.cursor() max_price=5 c.execute("""SELECT spam, eggs, sausage FROM breakfast WHERE price < %s""", (max_price,))

在這個例子中,max_price=5 那么為什么在字符串中使用 %s 呢? 因為 MySQLdb 會將其轉換為 SQL 文字值,即字符串 '5'。 完成后,查詢實際上會說“...WHERE price < 5”。

通常,如果您嘗試像這樣以編程方式創建表名,那么使用不同的模式會更開心。 我建議制作一個這樣的表,其中包含一個額外的列,其中包含您現在用於表名的字符串。

暫無
暫無

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

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