Повторные MySQL запросов от Python - PullRequest
1 голос
/ 11 апреля 2020

Мне нужно повторно запрашивать MySQL БД из Python, так как данные быстро меняются. Каждый раз, когда данные читаются, они передаются в список.

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

import mysql.connector
from mysql.connector import Error
from time import sleep

# Create empty list to store values from database.
listSize = 100
myList = []

for i in range(listSize):
    myList.append([[0,0,0]])

# Connect to MySQL Server
mydb = mysql.connector.connect(host='localhost',
                               database='db',
                               user='user',
                               password='pass')

# Main loop
while True:

    # SQL query
    sql = "SELECT * FROM table"

    # Read the database, store as a dictionary
    mycursor = mydb.cursor(dictionary=True)
    mycursor.execute(sql)

    # Store data in rows
    myresult = mycursor.fetchall()

    # Transfer data into list
    for row in myresult:
        myList[int(row["rowID"])] = (row["a"], row["b"], row["c"])

        print(myList[int(row["rowID"])])

    print("---")
    sleep (0.1)

Я пытался использовать fetchall, fetchmany и fetchone.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

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

# Main loop
while True:

    # SQL query
    sql = "SELECT * FROM table"

    # Read the database, store as a dictionary
    mycursor = mydb.cursor(dictionary=True)
    mycursor.execute(sql)

    # Store data in rows
    myresult = mycursor.fetchall()

    # Transfer data into list
    for row in myresult:
        myList[int(row["rowID"])] = (row["a"], row["b"], row["c"])

        print(myList[int(row["rowID"])])

    # Commit !
    mydb.commit()
    print("---")
    sleep (0.1)

Концепция здесь - уровни изоляции. Из документов (выделение мое):

REPEATABLE READ

Это уровень изоляции по умолчанию для InnoDB. Согласованное чтение в одной и той же транзакции чтение снимка, созданного первым чтением .

1 голос
/ 11 апреля 2020

Я бы сделал несколько изменений. Сначала объявите курсор перед тем, как l oop. Я бы тоже сделал буферный курсор. И, наконец, закройте курсор и БД после того, как файл готов. Надеюсь, это поможет.

import mysql.connector
from mysql.connector import Error
from time import sleep

# Create empty list to store values from database.
listSize = 100
myList = []

for i in range(listSize):
    myList.append([[0,0,0]])

# Connect to MySQL Server
mydb = mysql.connector.connect(host='localhost',
                               database='db',
                               user='user',
                               password='pass')
mycursor = mydb.cursor(buffered=True, dictionary=True)

# Main loop
while True:

    # SQL query
    sql = "SELECT * FROM table"

    # Read the database, store as a dictionary
    mycursor.execute(sql)

    # Store data in rows
    myresult = mycursor.fetchall()

    # Transfer data into list
    for row in myresult:
        myList[int(row["rowID"])] = (row["a"], row["b"], row["c"])

        print(myList[int(row["rowID"])])

    print("---")
    sleep (0.1)
mycursor.close()
mydb.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...