Запрос базы данных Python не обновляется - PullRequest
0 голосов
/ 13 мая 2019

Я извлекаю данные из базы данных в скрипте Python, который работает при запуске, но не обновляется, когда я изменяю значение в базе данных.

Скрипт сначала подключается к базе данных, затем выбирает все содержимоегде id равен 1 (это число столбцов, которые я собираюсь использовать)

Затем обновляется глобальная переменная garageHeating с содержимым из столбца garage, допустим, что при запуске он равен 0.

Цикл while выводит эту переменную, которая при запуске будет 0

Если я изменю гараж столбцов в базе данных на 10, сценарий python останется равным 0. Он не обновляется.глобальная переменная, которая, как я думал, должна делать

, мой скрипт ниже

import mysql.connector as mariadb

mariadb_connection = mariadb.connect(
  host="localhost",
  user="garage",
  passwd="*******",
  database="mydb"
  )
cursor = mariadb_connection.cursor()

garageHeating = 0 

def readDbHeating():
   global garageHeating
   result = []
   try:
      cursor.execute ("SELECT * FROM heating WHERE id = '1'")
      for reading in cursor.fetchall():
         result.append (reading)
         garageHeating = result[0][8]
   except () as e:
      print (e)

while 1:
   readDbHeating()
   print garageHeating

Я отредактировал приведенный выше код, чтобы показать глобальную переменную вне функции, а также распечататьрезультат в команде try.Я все еще получаю ту же проблему после первого извлечения данных из базы данных, сценарий продолжает отображать данные первого набора, но не обновляется до новых данных, если я изменяю записи базы данных.

import mysql.connector as mariadb

mariadb_connection = mariadb.connect(
  host="localhost",
  user="garage",
  passwd="14Odiham",
  database="mydb"
  )
cursor = mariadb_connection.cursor()

global garageHeating

def readDbHeating():
   result = []
   try:
      cursor.execute ("SELECT * FROM heating WHERE id = '1'")
      for reading in cursor.fetchall():
         result.append (reading)
         garageHeating = result[0][8]
         print garageHeating
         print result
   except () as e:
      print (e)

while 1:
    readDbHeating()
    #print garageHeating

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Вы должны либо вызвать MySQLdb.connections.Connection.commit перед выполнением запроса, либо установить autocommit для объекта подключения.

Фиксация перед запросом

def readDbHeating():
   global garageHeating
   result = []
   try:
      # commit
      mariadb_connection.commit()
      cursor.execute ("SELECT * FROM heating WHERE id = '1'")
      for reading in cursor.fetchall():
         result.append (reading)
         garageHeating = result[0][8]
   except () as e:
      print (e)

Автокоммит при создании соединения

mariadb_connection = mariadb.connect(
  host="localhost",
  user="garage",
  passwd="14Odiham",
  database="mydb",
  # Auto commit
  autocommit=True
  )

Автокоммит после создания соединения

mariadb_connection.autocommit(True)
0 голосов
/ 14 мая 2019

Кажется, у меня это работает.Я должен открыть соединение с базой данных, а затем закрыть соединение внутри функции, как показано ниже.Это отличается от того, что я делал в прошлом с mysql, но на данный момент, по крайней мере, теперь это работает

import mysql.connector as mariadb
import time

garageHeating = 0

def readDbHeating():
   mariadb_connection = mariadb.connect(
     host="localhost",
     user="garage",
     passwd="14Odiham",
     database="mydb"
     )
   cursor = mariadb_connection.cursor()
   result = []
   try:
      cursor.execute ("SELECT * FROM heating WHERE id = '1'")
      for reading in cursor.fetchall():
         result.append (reading)
   except () as e:
      print (e)
   finally:
    #closing database connection.
    if(mariadb_connection.is_connected()):
        mariadb_connection.close()
        print("connection is closed")
   return (result)


while 1:
   test = readDbHeating()
   print test
   time.sleep(1)
...