2012-07-06 11 views
7

मैं Python3 में एक MySQL डीबी में इनपुट से कैसे बच सकता हूं? मैं PyMySQL उपयोग कर रहा हूँ और ठीक काम करता है, लेकिन जब मैं की तरह कुछ करने की कोशिश: अगर स्ट्रिंग ' या " है यह काम नहीं करेगामैं Python3 में एक MySQL डीबी में इनपुट से कैसे बच सकता हूं?

cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = '{}'".format(request[1])) 

। मैं भी करने की कोशिश की:

cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = %s",request[1]) 

इस के साथ समस्या यह है कि पुस्तकालय (PyMySQL) Python2.x, % के लिए स्वरूपण वाक्य रचना, कि अब और काम नहीं करता है का उपयोग करता है। मैं भी here में यह संभव समाधान

conn.escape_string() 

पाया, लेकिन मैं जहां इस कोड को जोड़ना पता नहीं है। यह सब है मुझे मिल गया:

import pymysql 
import sys 
conn = pymysql.connect(host = "localhost", 
      user = "test", 
      passwd = "", 
      db  = "test") 
cursor = conn.cursor() 
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = {}".format(request[1])) 

result = cursor.fetchall() 

cursor.close() 
conn.close() 

संपादित करें: मैं इसे हल! PyMySQL में सही तरीके से इस तरह है:

import pymysql 
import sys 
conn = pymysql.connect(host="localhost", 
      user="test", 
      passwd="", 
      db="test") 
cursor = conn.cursor() 
text = conn.escape(request[1]) 
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = {}".format(text)) 

cursor.close() 
conn.close() 

कहाँ text = conn.escape(request[1]) लाइन क्या कोड निकल जाता है। इसे PyMySQL कोड के अंदर मिला। वहां, request[1] इनपुट है।

+1

कूल। हालांकि, आपको अपने प्रश्न के दूसरे भाग को उत्तर के रूप में पोस्ट करना चाहिए। आप अपना जवाब स्वीकार कर सकते हैं। – Grilse

+0

ओह, मैंने पहले उस बटन को नहीं देखा था। – user1460016

+0

यदि हल किया गया है, तो स्वीकार किए गए अपने प्रश्न को ध्वजांकित करें। :-) – Jocelyn

उत्तर

6

हल हो गया। PyMySQL में सही तरीके से इस तरह है:

import pymysql 
import sys 
conn = pymysql.connect(host="localhost", 
      user="test", 
      passwd="", 
      db="test") 
cursor = conn.cursor() 
text = conn.escape(request[1]) 
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = {}".format(text)) 

cursor.close() 
conn.close() 

कहाँ text = conn.escape(request[1]) लाइन क्या कोड निकल जाता है। इसे PyMySQL कोड के अंदर मिला। वहां, request[1] इनपुट है।

14

हालांकि "हल" उत्तर काम करता है, यह सबसे अच्छा अभ्यास नहीं है। पाइथन डीबीआई के अनुरूप लाइब्रेरी का उपयोग करते समय, आपको स्ट्रिंग को स्वरूपित करने और इसे निष्पादित करने के बजाय बाध्य चर का उपयोग करना चाहिए। उस पद्धति में निहित खतरे हैं।

cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = %s", text) 

ध्यान दें कि यह एक प्रारूप स्ट्रिंग लेकिन एक बाँध चर क्रियान्वित कर्सर को पास नहीं है:

इसलिए, इस यह करने के लिए सही तरीका है।

जानकारी के लिए: Python DBI PEP

+0

ध्यान दें कि '% s' का उपयोग विभिन्न प्रकारों, जैसे पूर्णांक के साथ भी किया जाना चाहिए। मैं '% d' का उपयोग करने की कोशिश कर रहा था और त्रुटि मिली: '% d प्रारूप: एक संख्या आवश्यक है, str नहीं। – nephets

0

उपयोग के लिए तैयार सहायक समारोह

def mysql_insert(conn, table, row): 
    cols = ', '.join('`{}`'.format(col) for col in row.keys()) 
    vals = ', '.join('%({})s'.format(col) for col in row.keys()) 
    sql = 'INSERT INTO `{0}` ({1}) VALUES ({2})'.format(table, cols, vals) 
    conn.cursor().execute(sql, row) 
    conn.commit() 

प्रयोग उदाहरण

insert_into(conn, 'people', { 
    'firstname': 'John', 
    'lastname': 'Doe', 
    'age': 18, }) 

संदर्भ: https://github.com/PyMySQL/PyMySQL/blob/master/pymysql/cursors.py#L157-L158

def execute(self, query, args=None):

If args is a list or tuple, %s can be used as a placeholder in the query. 
If args is a dict, %(name)s can be used as a placeholder in the query. 
संबंधित मुद्दे