【问题标题】:How To Fetch data in Python from MySQL database如何从 MySQL 数据库中获取 Python 中的数据
【发布时间】:2014-10-18 05:42:09
【问题描述】:

我是 python 新手,当我在 MySQL 查询中传递参数时从 MySQL DB 获取数据时遇到问题,我认为我的 MySQL 语法不正确。

这是屏幕上显示的错误,如下所示。

内部服务器错误

服务器遇到内部错误或配置错误,无法完成您的请求。
请通过 webmaster@localhost 联系服务器管理员,告知他们此错误发生的时间,以及您在此错误之前执行的操作。
服务器错误日志中可能提供有关此错误的更多信息。 Apache/2.4.6 (Ubuntu) 服务器在 localhost 端口 80

这是我的 Select 查询代码,我想从 Url 的 get 参数中获取数据。

#!/usr/bin/python2.7

import cgi
import cgitb 

cgitb.enable()


print "Content-type: text/html\n\n"

print "<h1>Hello Python</h1>"

#!/usr/bin/python

import MySQLdb

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
first_name = form.getvalue('first_name')
last_name  = form.getvalue('last_name')

# Open database connection
db = MySQLdb.connect("localhost","root","123456789","testdrive" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database
sqlstmt = "SELECT * FROM EMPLOYEE WHERE FIRST_NAME = %(first_name)s AND LAST_NAME = %(last_name)s"
    
try:
   # Execute the SQL command
 cursor.execute(sqlstmt, {'first_name': first_name, 'last_name': last_name})
   # Fetch all the rows in a list of lists.
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
      # Now print fetched result
      print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
             (fname, lname, age, sex, income )
except:
   print "Error: unable to fecth data"

# disconnect from server
db.close()

【问题讨论】:

  • 请任何人帮助我

标签: python mysql cgi


【解决方案1】:

你在这行有错误

sql = "SELECT * FROM EMPLOYEE WHERE FIRST_NAME = '".first_name."' AND LAST_NAME = '".last_name."'"

这不是 PHP,这意味着您不能像这样连接字符串和变量。我假设你不想做出准备好的陈述。在这种情况下,您应该阅读以下reply

您的代码的相关部分如下所示:

cursor.execute("SELECT * FROM EMPLOYEE WHERE FIRST_NAME = %s AND LAST_NAME = %s", [first_name, last_name])

【讨论】:

  • cursor.execute 仍然有错误的缩进,在你的代码中仔细检查。之后,我看不到其他错误。我建议您使用 try&except 包装导入 MySQLdb 并在 db = MySQLdb.connect("localhost","root","123456789","testdrive" ) 中创建实例,以查看是否不存在错误。如果不是,那么您的 cgi 很可能配置错误(尽管我认为我从未见过,假设您有默认值)。你在日志中发现什么了吗? /var/log/apache2/error.log 最有可能。另外,尝试在您的第一次打印中将\n\n 替换为\r\n\r\n
【解决方案2】:

首先,您应该尝试将所有这些抽象为一个可以在 CGI 之外调用的函数,但现在这完全是另一个练习了。无论如何,如果你这样做了,你可以更容易地看到你做错了什么,但是,我可以看到你在你帮助包含的代码中有语法错误

sql = "SELECT * FROM EMPLOYEE WHERE FIRST_NAME = '".first_name."' AND LAST_NAME = '".last_name."'"

Python 字符串连接使用 + 运算符,而不是像 PHP 中那样使用 .

其次,此代码不安全。见http://xkcd.com/327/

为了解决这个问题,cursor.execute 方法提供了第二个参数来填写标记,这是你应该做的

sqlstmt = "SELECT * FROM EMPLOYEE WHERE FIRST_NAME = %(first_name)s AND LAST_NAME = %(last_name)s"

try:
    cursor.execute(sqlstmt, {'first_name': first_name, 'last_name': last_name})
...

【讨论】:

  • 您可能会看到我不小心在倒数第三个字符处留下了一个单引号(复制/粘贴失败),我将其删除。
  • 如果您发布一些回溯以向我们展示您的错误所在,也会有所帮助。
  • 我无法看到堆栈跟踪,因为我没有任何用于在 python 中进行应用程序开发的 IDE
  • More information about this error may be available in the server error log. Apache/2.4.6 (Ubuntu) Server at localhost Port 80 请参阅您的日志,您的 python CGI 环境也可能配置错误(除非您的 Hello World 示例有效)。
  • 感谢您的友好信息@kecer 我检查一下。
【解决方案3】:

我认为我们在这里不需要fetchall(),这可能是 sqlite 代码的遗留问题。只需执行以下操作:

for row in cursor:
    x = row[0]
    y = row[1]
    ...

【讨论】:

    【解决方案4】:

    试试这个代码

    import mysql.connector
    from mysql.connector import Error
    try:
       mySQLconnection = mysql.connector.connect(host='localhost',
                                 database='python_database',
                                 user='username',
                                 password='passw0rd')
       sql_select_Query = "select * from tablename"
       cursor = mySQLconnection .cursor()
       cursor.execute(sql_select_Query)
       records = cursor.fetchall()
    
       for row in records:
           print("Sr No = ", row[0], )
           print("Name = ", row[1])
           print("Age  = ", row[2])
           print("Gender  = ", row[3], "\n")
       cursor.close()
    
    except Error as e :
        print ("Error connecting MySQL", e)
    finally:
        #closing database connection.
        if(mySQLconnection .is_connected()):
            connection.close()
            print("MySQL connection is closed Now"
    

    Ref

    【讨论】:

      猜你喜欢
      • 2015-03-11
      • 2018-03-24
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 2021-11-08
      • 1970-01-01
      相关资源
      最近更新 更多