Python MySQL数据操作

Python MySQL数据操作,python,Python,我有一个大学的作业,我碰到了一堵墙,不管我怎么努力,我似乎都无法让它工作 因此,本任务的重点是从Python访问MySQL数据库,并查看和排列数据。数据库名为inb104,有两个表,cars\U for\U sale和car\U details 这是我的密码 def top_N_expensive(num_of_highest): connection = MySQLdb.connect(host='localhost', user='root', passwd='root',\

我有一个大学的作业,我碰到了一堵墙,不管我怎么努力,我似乎都无法让它工作

因此,本任务的重点是从Python访问MySQL数据库,并查看和排列数据。数据库名为inb104,有两个表,cars\U for\U sale和car\U details

这是我的密码

def top_N_expensive(num_of_highest):
connection = MySQLdb.connect(host='localhost', user='root', passwd='root',\
                                                                 db='inb104')
cursor = connection.cursor()
sql = "SELECT cars_for_sale.make, cars_for_sale.model, +'$'+car_details.price \
            FROM cars_for_sale, car_details WHERE cars_for_sale.CarId = car_details.CarId \
            ORDER BY price DESC,price LIMIT " + str(num_of_highest)
cursor.execute(sql) 
rows = cursor.fetchall()
for row in rows:
    print row[0], row[1], row[2]
cursor.close()
connection.close()
现在,当我运行这段代码时,测试用例失败了,这只是其中一个测试用例,但其余的都是一样的

File "__main__", line 4, in __main__
Failed example:
top_N_expensive(10)
Expected:
VOLKSWAGEN GOLF $1300000
MERCEDES-BENZ SL $329990
BMW 3 $299990
MERCEDES-BENZ SL $249990
PORSCHE 911 $249990
MERCEDES-BENZ SL $224990
PORSCHE 911 $219990
PORSCHE 911 $190000
PORSCHE 911 $184990
BMW M5 $180000
Got:
VOLKSWAGEN GOLF 1300000.0
MERCEDES-BENZ SL 329990.0
BMW 3 299990.0
MERCEDES-BENZ SL 249990.0
PORSCHE 911 249990.0
MERCEDES-BENZ SL 224990.0
PORSCHE 911 219990.0
PORSCHE 911 190000.0
PORSCHE 911 184990.0
BMW M5 180000.0
正如你所看到的,它失败了,因为结尾是零,开头没有美元,有人知道这个问题吗

编辑:添加此新代码后

for row in rows:
    print "%s %s $%d" % (row[0], row[1], row[2]) 
我通过了3/4个测试用例,我不知道为什么最后一个没有通过,但这里是测试用例转储

Trying:
top_N_expensive(10)
Expecting:
VOLKSWAGEN GOLF $1300000
MERCEDES-BENZ SL $329990
BMW 3 $299990
MERCEDES-BENZ SL $249990
PORSCHE 911 $249990
MERCEDES-BENZ SL $224990
PORSCHE 911 $219990
PORSCHE 911 $190000
PORSCHE 911 $184990
BMW M5 $180000

Warning (from warnings module):
File "Z:\Documents\top_N_expensive.py", line 82
cursor.execute(sql)
Warning: Truncated incorrect DOUBLE value: '$'
ok
Trying:
top_N_expensive(15)
Expecting:
VOLKSWAGEN GOLF $1300000
MERCEDES-BENZ SL $329990
BMW 3 $299990
MERCEDES-BENZ SL $249990
PORSCHE 911 $249990
MERCEDES-BENZ SL $224990
PORSCHE 911 $219990
PORSCHE 911 $190000
PORSCHE 911 $184990
BMW M5 $180000
MERCEDES-BENZ E55 $179990
MERCEDES-BENZ CLS $179990
PORSCHE 911 $165000
PORSCHE 911 $164900
PORSCHE 911 $161950
**********************************************************************
File "__main__", line 17, in __main__
Failed example:
top_N_expensive(15)
Expected:
VOLKSWAGEN GOLF $1300000
MERCEDES-BENZ SL $329990
BMW 3 $299990
MERCEDES-BENZ SL $249990
PORSCHE 911 $249990
MERCEDES-BENZ SL $224990
PORSCHE 911 $219990
PORSCHE 911 $190000
PORSCHE 911 $184990
BMW M5 $180000
MERCEDES-BENZ E55 $179990
MERCEDES-BENZ CLS $179990
PORSCHE 911 $165000
PORSCHE 911 $164900
PORSCHE 911 $161950
Got:
VOLKSWAGEN GOLF $1300000
MERCEDES-BENZ SL $329990
BMW 3 $299990
MERCEDES-BENZ SL $249990
PORSCHE 911 $249990
MERCEDES-BENZ SL $224990
PORSCHE 911 $219990
PORSCHE 911 $190000
PORSCHE 911 $184990
BMW M5 $180000
MERCEDES-BENZ CLS $179990
MERCEDES-BENZ E55 $179990
PORSCHE 911 $165000
PORSCHE 911 $164900
PORSCHE 911 $161950
Trying:
top_N_expensive(1)
Expecting:
VOLKSWAGEN GOLF $1300000
ok
Trying:
top_N_expensive(0)
Expecting nothing
ok
1 items had no tests:
__main__.top_N_expensive
**********************************************************************
1 items had failures:
1 of   4 in __main__
4 tests in 2 items.
3 passed and 1 failed.
***Test Failed*** 1 failures.
所以,不知道为什么现在失败了,很奇怪

这是更新后的查询

def top_N_expensive(num_of_highest):
connection = MySQLdb.connect(host='localhost', user='root', passwd='root',\
                                                                 db='inb104')
cursor = connection.cursor()
sql = "SELECT cars_for_sale.make, cars_for_sale.model, +'$'+car_details.price \
            FROM cars_for_sale, car_details WHERE cars_for_sale.CarId = car_details.CarId \
            ORDER BY price DESC, make, model DESC" + str(num_of_highest)
cursor.execute(sql) 
rows = cursor.fetchall()
for row in rows:
    print "%s %s $%d" % (row[0], row[1], row[2]) 
cursor.close()
connection.close()
测试用例

Trying:
top_N_expensive(10)
Expecting:
VOLKSWAGEN GOLF $1300000
MERCEDES-BENZ SL $329990
BMW 3 $299990
MERCEDES-BENZ SL $249990
PORSCHE 911 $249990
MERCEDES-BENZ SL $224990
PORSCHE 911 $219990
PORSCHE 911 $190000
PORSCHE 911 $184990
BMW M5 $180000
**********************************************************************
File "__main__", line 4, in __main__
Failed example:
top_N_expensive(10)
Exception raised:
Traceback (most recent call last):
  File "C:\Program Files\Python27\lib\doctest.py", line 1254, in __run
    compileflags, 1) in test.globs
  File "<doctest __main__[0]>", line 1, in <module>
    top_N_expensive(10)
  File "Z:\Documentstop_N_expensive.py", line 82, in top_N_expensive
    cursor.execute(sql)
  File "C:\Program Files\Python27\lib\site-packages\MySQLdb\cursors.py", line 174, in execute
    self.errorhandler(self, exc, value)
  File "C:\Program Files\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
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 'DESC10' at line 1")
正在尝试:
最贵的(10)
期望:
大众高尔夫130万美元
梅赛德斯-奔驰SL$329990
宝马3$29990
梅赛德斯-奔驰SL$249990
保时捷911$249990
梅赛德斯-奔驰SL 224990美元
保时捷911 219990美元
保时捷911 190000美元
保时捷911 184990美元
宝马M5 180000美元
**********************************************************************
文件“\uuuu main\uuuuu”,第4行,在\uuuuu main中__
失败示例:
最贵的(10)
提出的例外情况:
回溯(最近一次呼叫最后一次):
文件“C:\Program Files\Python27\lib\doctest.py”,第1254行,正在运行
test.globs中的compileflags,1)
文件“”,第1行,在
最贵的(10)
文件“Z:\Documentstop\u N\u priced.py”,第82行,位于顶部
cursor.execute(sql)
文件“C:\Program Files\Python27\lib\site packages\MySQLdb\cursors.py”,执行中的第174行
errorhandler(self、exc、value)
defaulterrorhandler中的文件“C:\Program Files\Python27\lib\site packages\MySQLdb\connections.py”,第36行
提高errorclass,errorvalue
编程错误:(1064,“您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解第1行“DESC10”附近使用的正确语法”)

看看这个问题,它很可能就是你想要的。作为一种更黑客的方式,您可以转换为字符串并使用字符串操纵

编辑

摘自上述参考问题

>>> import locale
>>> locale.setlocale( locale.LC_ALL, '' )
'English_United States.1252'
>>> locale.currency( 188518982.18 )
'$188518982.18'
>>> locale.currency( 188518982.18, grouping=True )
'$188,518,982.18'

看看这个问题,它很可能是你想要的。作为一种更黑客的方式,您可以转换为字符串并使用字符串操纵

编辑

摘自上述参考问题

>>> import locale
>>> locale.setlocale( locale.LC_ALL, '' )
'English_United States.1252'
>>> locale.currency( 188518982.18 )
'$188518982.18'
>>> locale.currency( 188518982.18, grouping=True )
'$188,518,982.18'
做一些简单的事情可以让你达到目的:

for row in rows:
    print "%s %s $%d" % (row[0], row[1], row[2])
%s
字符用于输出字符串<代码>%d用于输出整数(没有小数部分的数字),因此有点作弊。您还可以使用
%.0f
显示小数点后0位打印的浮点(而
%.2f
将数字显示为小数点后两位)。

做一些简单的操作可以达到以下目的:

for row in rows:
    print "%s %s $%d" % (row[0], row[1], row[2])

%s
字符用于输出字符串<代码>%d用于输出整数(没有小数部分的数字),因此有点作弊。您还可以使用
%.0f
显示小数点后0位的浮点(而
%.2f
将数字显示为小数点后两位)。

与前面的方法略有不同:

for row in rows:
    print("{} {} ${:0.0f}".format(*row))
编辑:编辑的后续操作-您在E55之前返回CLS,它希望它们以另一种方式返回。检查您的分拣顺序;试一试

... ORDER BY price DESC, make, model DESC

与前一版本略有不同:

for row in rows:
    print("{} {} ${:0.0f}".format(*row))
编辑:编辑的后续操作-您在E55之前返回CLS,它希望它们以另一种方式返回。检查您的分拣顺序;试一试

... ORDER BY price DESC, make, model DESC

如果要在
SELECT
语句中执行此操作,可以尝试使用和:

选择CONCAT(“$”,ROUND(car\u details.price))作为car\u details中的价格;

如果您想在
选择
语句中执行此操作,您可以尝试使用和:

选择CONCAT(“$”,ROUND(car\u details.price))作为car\u details中的价格;


至于零,看起来需要通过Python float函数运行这些值。至于no$,您可能需要打印它。您需要使用sql语句本身获取结果,还是可以自己格式化输出。如果是晚些时候,你可能已经有了解决方案。我可以格式化输出,我想,任何一种方法都可以,没有学术上的限制,只是不确定我会怎么做。抱歉,我是Python编程新手。新的失败是因为“MERCEDES-BENZ E55”和“MERCEDES-BENZ CLS”颠倒了。你的订单条款没有意义。我认为您需要按价格、制造、型号订购。至于零,看起来您需要通过Python float函数运行这些值。至于no$,您可能需要打印它。您需要使用sql语句本身获取结果,还是可以自己格式化输出。如果是晚些时候,你可能已经有了解决方案。我可以格式化输出,我想,任何一种方法都可以,没有学术上的限制,只是不确定我会怎么做。抱歉,我是Python编程新手。新的失败是因为“MERCEDES-BENZ E55”和“MERCEDES-BENZ CLS”颠倒了。你的订单条款没有意义。我想你想要
按价格说明、制造、型号订购。
在这里举个例子怎么样?在这里举个例子怎么样?为帮助汤姆干杯,我已经用进一步的测试用例编辑了原始帖子,只是一个似乎失败了,但为了我的生命,我不知道为什么。为帮助汤姆干杯,我已经用进一步的测试用例编辑了原来的帖子,只是一个似乎失败了,但就我而言,我不知道为什么。我试着使用你的编辑,它似乎使所有的测试用例都失败了!好吧,出乎意料。。。您是否可以显示其中一个结果失败“”“预期”与“获得”?您好,我已在底部编辑了原始帖子。看起来您从查询字符串中删除了“限制”,结果是“按价格说明订购,制造,型号说明12”(这是错误的语法)。尝试粘贴限制b