2017-01-24 8 views
0

私はBACプロジェクトを作成しています。私は私のMySQLデータベースからクエリ時間が欲しいです。私のデータベースであるこの時間で、私はリアルタイムと比較したいと思います。私はTypeError:datetime.timeをタプルと比較できません

...ので、Python言語で始まる[ここで、それは私のデータベースです] [ここ

https://i.stack.imgur.com/ROxnQ.png]は私のコードですが、私はエラー「TypeError例外を:datetime.timeのを比較することはできませんタプルする」必要があり

import RPi.GPIO as GPIO 
import time 
import datetime 
import MySQLdb 


GPIO.setmode(GPIO.BOARD) 
GPIO.setup(40, GPIO.OUT) 
GPIO.setup(38, GPIO.OUT) 

db = MySQLdb.connect(host="localhost", # your host, usually localhost 
        user="root",   # your username 
        passwd="Orel_27130", # your password 
        db="projet")  # name of the data base 




while True: 
    now = datetime.datetime.time(datetime.datetime.now()) 
    print (now) 
    print time.strftime("%H:%M:%S") 
    cursor = db.cursor() 
    cursor.execute("SELECT time_open FROM time WHERE id = 2") 
    time_open = cursor.fetchall() 
    print time_open 
    if time_open < now: 
     print ("Fermee") 
     GPIO.output(38, False) 
     GPIO.output(40, True) 
    else: 
     print ("Ouvert") 
     GPIO.output(38, True) 
     GPIO.output(40, False) 

出力:

((datetime.datetime(2017, 1, 23, 13, 0),),) 
Traceback (most recent call last): 
    File "mysql.py", line 27, in <module> 
    if time_open < now: 
TypeError: can't compare datetime.time to tuple 
+0

"print time_open"文での印刷は何ですか? "time_open"変数のタイプは何ですか? –

+0

print time_openは、スクリプトがデータを正しく照会するかどうかを確認するためのものです。 – iDezwin

+1

'print(now)'は​​ 'print now'と同じことです。 'datetime'オブジェクトの*文字列表現*を出力します。**これはMySQLから返されたデータと同じに見えるかもしれませんが、同じ種類のオブジェクトにはなりません。 –

答えて

4

あなたは、データベースからすべての行をフェッチしています。これらの行はタプルに格納され、各行はタプルの列です。私は最初の結果行をフェッチのみにcursor.fetchone()を使用

time_open = cursor.fetchone() 
if time_open[0] < now: 

:あなたが行の最初の(そして唯一の)列を比較したい場合は、エキスその列にする必要があります。

またdatetime.datetime.time()コール削除する必要があります。

now = datetime.datetime.now() 

それはまた、MySQLが返すオブジェクトの型だからあなたは、datetimeオブジェクト、日付でをしたいし。

time_open[0]datetime.datetimeオブジェクトであることを前提としています。

((datetime.datetime(2017, 1, 23, 13, 0),),) 

datetime.datetime()オブジェクトを含む別のタプル(列と1行)を含むタプル(行)です:あなたのトレースバックは、あなたのコード内のprint time_openの文から、そのようなオブジェクトによって、先行されました。 MySQLデータベースアダプタ(MySQLdb)は、データベースによって報告されたカラムタイプに基づいてそのオブジェクトを作成しました。 MySQL DATETIMEタイプのカラムはここでdatetimeオブジェクトに変換されます。あなたが(コメントで新しいエラーメッセージが示唆しているようだ)TIME列を持っている代わりに、場合

は、その後、値が時間を経過する日と秒を記録し、代わりにdatetime.timedelta()オブジェクトに変換されます。あなたはこれではなく日時間であることが予想場合は、datetime.datetimeオブジェクトにはtimedeltaを変換するために、いずれかの必要があります。

midnight = datetime.datetime.combine(datetime.date.today(), datetime.time.min) 
if (midnight + time_now[0]) > now: 
    # ... 

またはが深夜にはtimedelta相対にnow値を変換:

# timedelta since midnight 
midnight = datetime.datetime.combine(datetime.date.today(), datetime.time.min) 
now_relative = datetime.datetime.now() - midnight 

# ... 
if time_now[0] < now_relative: 
+0

は、私はこのトレースバック トレースバック(最後の最新の呼び出し)を持っています.timedelta to datetime.time – iDezwin

+0

'time_open [0]'は 'datetime.timedelta'型です。 –

+0

@abc:トレースバックに含まれていた印刷出力は、 'datetime.dimetime()'ではなく 'datetime.datetime()'であることを示しています。 –

-1

タプルをdatetime.datetime形式に変換するだけで済みます。

+1

まあ、本当に?そしてOPはそれをどのようにして行うのだろうか?これは、「働くようにプログラムする」ような便利な答えです。 –

+0

それはスプーン給餌のようなものです。私はちょうど問題を解決することができるヒントを与えた。 –

+0

スプーン給食はどこにありますか?これは将来のすべての訪問者に役立つように、質問と回答のサイトです*ので、私たちは*役に立つ*と期待しています。この1つではありません。 –

関連する問題