0

大学の課題があり、壁にぶち当たりました。何を試してもうまくいかないようです。

そのため、この割り当ては、Python から MySQL データベースにアクセスし、データを表示して整理することに重点を置いています。データベースは inb104 と呼ばれ、cars_for_sale と car_details の 2 つのテーブルが存在します。

これが私のコードです

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()

このコードを実行すると、テスト ケースが失敗します。これはテスト ケースの 1 つにすぎませんが、残りは同じです

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 のテスト ケースに合格しました。最後の 1 つが合格しなかった理由はわかりませんが、テスト ケースのダンプは次のとおりです。

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")
4

4 に答える 4

3

前のわずかなバリエーション:

for row in rows:
    print("{} {} ${:0.0f}".format(*row))

編集: 編集のフォローアップ - E55 の前に CLS を返していますが、逆の方法が必要です。ソート順を確認してください。試す

... ORDER BY price DESC, make, model DESC
于 2012-05-22T14:26:00.597 に答える
1

SELECTあなたがステートメントでそれをしたいなら、あなたはとでCONCAT試すことができますROUND

SELECT CONCAT('$', ROUND(car_details.price)) AS price FROM car_details;
于 2012-05-22T14:27:58.083 に答える
0

puythonでこの質問の通貨の書式設定を見てください。それはおそらくあなたが望むものです。よりハックな方法として、文字列に変換して文字列操作を使用できます。

編集

上記の参照された質問からコピー

>>> 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'
于 2012-05-22T14:05:15.187 に答える
0

簡単な文字列の書式設定を行うと、次のようになります。

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

%s文字は文字列を出力するためのものです。%d整数(小数部分のない数字)を出力するためのものなので、ちょっとしたチートです。%.0fを使用して、小数点以下 0 桁で印刷された float を表示することもできます(%.2f数値は小数点以下 2 桁まで表示されます)。

于 2012-05-22T14:10:23.940 に答える