python을 사용하여 데이터베이스에서 최신 데이터 반복 선택
데이터베이스의 가장 최근 데이터 행을 python을 사용하여 변수에 저장하려고 하지만 스크립트는 가장 최근의 데이터 집합이 아닌 실행 시 데이터 행을 저장하고 있습니다.
아래는 데이터베이스에서 마지막 행을 가져오는 코드를 보여줍니다.데이터베이스는 매 분마다 새 데이터 행을 가져옵니다.
#!/usr/bin/env python
#import required modules
from time import sleep
import MySQLdb
#set MySQL Variables
host = "localhost"
user = "user"
password = "pass"
schema = "schema"
#connect to MySQL
db = MySQLdb.connect(host, user, password, schema)
curs = db.cursor()
#Define Sql Queries to Read the last Value in the Database
sqlT="SELECT temperature FROM system_info ORDER BY pi_id DESC LIMIT 1"
sqlH="SELECT humidity FROM system_info ORDER BY pi_id DESC LIMIT 1"
sqlIP="SELECT ip_address FROM system_info ORDER BY pi_id DESC LIMIT 1"
sqlDI1="SELECT DI1 FROM system_info ORDER BY pi_id DESC LIMIT 1"
sqlDI2="SELECT DI2 FROM system_info ORDER BY pi_id DESC LIMIT 1"
sqlDI3="SELECT DI3 FROM system_info ORDER BY pi_id DESC LIMIT 1"
sqlDI4="SELECT DI4 FROM system_info ORDER BY pi_id DESC LIMIT 1"
sqlDI5="SELECT DI5 FROM system_info ORDER BY pi_id DESC LIMIT 1"
sqlDI6="SELECT DI6 FROM system_info ORDER BY pi_id DESC LIMIT 1"
sqlDI7="SELECT DI7 FROM system_info ORDER BY pi_id DESC LIMIT 1"
sqlDI8="SELECT DI8 FROM system_info ORDER BY pi_id DESC LIMIT 1"
#Begin Script Infinitely
while True:
#Gather Values from Database
curs.execute(sqlT)
lastT = curs.fetchone()
for Temp in lastT:
temp_reading = Temp
curs.execute(sqlH)
lastH = curs.fetchone()
for Hum in lastH:
hum_reading = Hum
curs.execute(sqlDI1)
lastDI1 = curs.fetchone()
for DI1 in lastDI1:
DI1_reading = DI1
curs.execute(sqlDI2)
lastDI2 = curs.fetchone()
for DI2 in lastDI2:
DI2_reading = DI2
curs.execute(sqlDI3)
lastDI3 = curs.fetchone()
for DI3 in lastDI3:
DI3_reading = DI3
curs.execute(sqlDI4)
lastDI4 = curs.fetchone()
for DI4 in lastDI4:
DI4_reading = DI4
curs.execute(sqlDI5)
lastDI5 = curs.fetchone()
for DI5 in lastDI5:
DI5_reading = DI5
curs.execute(sqlDI1)
lastDI6 = curs.fetchone()
for DI6 in lastDI6:
DI6_reading = DI6
curs.execute(sqlDI1)
lastDI7 = curs.fetchone()
for DI7 in lastDI7:
DI7_reading = DI7
curs.execute(sqlDI8)
lastDI8 = curs.fetchone()
for DI8 in lastDI8:
DI8_reading = DI8
#Print Values
print(temp_reading)
print(hum_reading)
print(DI1_reading)
print(DI2_reading)
print(DI3_reading)
print(DI4_reading)
print(DI5_reading)
print(DI6_reading)
print(DI7_reading)
print(DI8_reading)
#Rest so Values change
sleep(61)
결과는 while 루프의 첫 번째 반복에 대해 올바르게 표시되지만 결과는 데이터베이스의 최신 데이터 집합으로 업데이트되지 않으며 행 데이터를 변수에 한 번 저장한 후 변수를 업데이트하지 않습니다.
내가 얻는 것:
22
45
Open
Open
Open
Open
Open
Open
Open
Open
22
45
Open
Open
Open
Open
Open
Open
Open
Open
제가 얻고자 하는 것:
22
45
Open
Open
Open
Open
Open
Open
Open
Open
25
56
Open
Open
Closed
Open
Open
Open
Open
Open
잘 부탁드립니다.
편집 게시물과 함께 제공되는 표 항목 예제 추가:
pi_id | time | ip_address | temperature | humidity | DI1 | DI2 | DI3 | DI4 | DI5 | DI6 | DI7 | DI8 |
5768 | 13:45 | 10.0.0.1 | 22 | 45 | Open | Open | Open | Open | Open | Open | Open | Open |
5769 | 13:46 | 10.0.0.1 | 25 | 56 | Open | Open | Closed | Open | Open | Open | Open | Open |
13시 45분에 스크립트를 실행하면 pi_id: 5768의 데이터 행을 수집하고 1분 후에 테이블에 새 데이터 행을 입력합니다. 코드의 루프가 다시 실행되면 pi_id: 5768의 데이터를 인쇄합니다. 이것은 제가 달성하려고 하는 것이 아닙니다.
DB 연결을 닫은 다음 While 루프의 시작 부분에서 다시 연결하여 필요한 결과를 얻을 수 있었습니다.
#Begin Script Infinitely
while True:
#Connect/Re-connect to database
db = MySQLdb.connect(host, user, password, schema)
#Define Cursor
curs = db.cursor()
#Gather Values from Database
curs.execute(sqlT)
lastT = curs.fetchone()
for Temp in lastT:
temp_reading = Temp
curs.execute(sqlH)
lastH = curs.fetchone()
for Hum in lastH:
hum_reading = Hum
curs.execute(sqlDI1)
lastDI1 = curs.fetchone()
for DI1 in lastDI1:
DI1_reading = DI1
curs.execute(sqlDI2)
lastDI2 = curs.fetchone()
for DI2 in lastDI2:
DI2_reading = DI2
curs.execute(sqlDI3)
lastDI3 = curs.fetchone()
for DI3 in lastDI3:
DI3_reading = DI3
curs.execute(sqlDI4)
lastDI4 = curs.fetchone()
for DI4 in lastDI4:
DI4_reading = DI4
curs.execute(sqlDI5)
lastDI5 = curs.fetchone()
for DI5 in lastDI5:
DI5_reading = DI5
curs.execute(sqlDI6)
lastDI6 = curs.fetchone()
for DI6 in lastDI6:
DI6_reading = DI6
curs.execute(sqlDI7)
lastDI7 = curs.fetchone()
for DI7 in lastDI7:
DI7_reading = DI7
curs.execute(sqlDI8)
lastDI8 = curs.fetchone()
for DI8 in lastDI8:
DI8_reading = DI8
#Close Cursor
curs.close()
#Disconnect from Database
db.close()
#Print Values
print(temp_reading)
print(hum_reading)
print(DI1_reading)
print(DI2_reading)
print(DI3_reading)
print(DI4_reading)
print(DI5_reading)
print(DI6_reading)
print(DI7_reading)
print(DI8_reading)
#Rest so Values change
sleep(60)
@Iandru27과 @Rick James가 아이디어를 전달해 주셔서 감사합니다.
이제 모든 것을 정리하여 복잡하거나 반복적이지 않도록 합니다.
감사해요.
저는 이것이 완전한 답이 아니라고 의심하지만 댓글을 달기에는 너무 깁니다.사전 목록 만들기:
data = []
c.execute("""SELECT * FROM system_info ORDER BY pi_id DE0SC LIMIT 1""")
headers = [item[0] for item in c.description] # List comprehension
for row in c.fetchall():
data.append([dict(zip(headers, row)])
이렇게 하면 쿼리가 한 번 실행되고 키로 값에 액세스하는 데 사용할 수 있는 사전 목록이 반환됩니다.현재 상태로는 LIMIT 1이 있으므로 행을 반복할 필요가 없지만 확장이 가능합니다.
언급URL : https://stackoverflow.com/questions/54256777/repeatedly-select-latest-data-from-database-using-python
'programing' 카테고리의 다른 글
Swift의 UITableView에 새 셀을 삽입하는 방법 (0) | 2023.08.11 |
---|---|
ImageView 소스 변경 (0) | 2023.08.11 |
jQuery를 사용하여 CKEditor의 iframe에서 내용 가져오기 (0) | 2023.08.06 |
JavaScript 파일을 동적으로 로드합니다. (0) | 2023.08.06 |
빠른 사전에서 키-값 쌍을 제거하는 방법은 무엇입니까? (0) | 2023.08.06 |