programing

Python MySQL이 새로 고쳐지지 않음

luckcodes 2022. 9. 19. 21:58

Python MySQL이 새로 고쳐지지 않음

두 가지 프로그램이 있습니다.데이터베이스를 채우고 업데이트하는 것과 데이터베이스에서 정보를 10초마다 선택하는 것.

Pymysql을 사용합니다.

데이터베이스를 업데이트할 때 데이터를 커밋하면 명령줄로 데이터베이스에서 결과를 볼 수 있지만 다른 프로그램의 출력은 동일하여 새 데이터를 얻지 못합니다.

다음 이외의 특별한 쿼리를 작성해야 합니까?SELECT모든 쿼리를 수행하기 전에 연결을 닫았다가 다시 열어야 합니까?

작성하다GetData프로그램 시작 시 수업과get_data는 10초마다 호출됩니다.

class GetData:
    def __init__(self):
        self.conn = pymysql.connect(host='localhost', user='root', password='', db='mydb', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)

    def get_data(self, data):
        with self.conn.cursor() as cursor:
            self.sql = "SELECT id_data, somedata FROM mytable WHERE (%s = 'example');"
            cursor.execute(self.sql, (data,))
        return cursor.fetchall()

    def close_conn(self):
        self.conn.close()

데이터베이스를 채우는 프로그램:

class FillDb:
    def __init__(self):
        self.conn = pymysql.connect(host='localhost', user='root', password='', db='mydb', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
        #added this line but doesen't help!
        self.conn.autocommit(True)

    def add_in_db(self, data):
        with self.conn.cursor() as cursor:
            self.sql = "INSERT INTO mytable (somedata) VALUES (%s);"
            cursor.execute(self.sql, (data,))
            self.conn.commit()

업데이트를 볼 수 없는 이유:

이 동작의 원인은 InnoDB의 기본 분리 수준인 Repeatable READ입니다.Repeatable READ를 사용하면 첫 번째 잠금 해제 SELECT가 해당 시점의 데이터를 나타내는 스냅샷을 설정합니다.모든 연속 비잠금 SELECT가 동일한 스냅샷에서 읽습니다.다른 트랜잭션의 DB 업데이트는 해당 스냅샷에 반영되지 않으므로 투명하게 유지됩니다.

트랜잭션을 커밋(또는 트랜잭션을 닫은 후 새 스냅샷을 생성)하면 다음 쿼리와 함께 새 스냅샷이 생성되어 해당 시점의 DB에 있는 데이터를 나타냅니다.이것이 MySQL이 ACID 컴플라이언스 전략의 일환으로 일관된 비잠금 판독을 구현하는 방법입니다.

왜죠with self.conn기능 및 기능:

PyMySQL에는 Cursor에 1개('문서화된')와 Connection에 1개(코드:D에 있습니다)의 2개의 관련 컨텍스트 매니저 구현이 있습니다.

사용했을 때with self.conn.cursor() as cursor:커서의 구현이 유효했습니다.반환되는 컨텍스트 입력self(에서 반환된 커서 오브젝트).cursor()에 대한 방법.self.conn콘텍스트를 남기는 것으로, 최종적으로 그 커서가 닫힙니다.거래에는 영향이 없습니다.

사용시with self.conn as cursor유효하게 되어 있는 것은, 접속의 실장입니다.콘텍스트를 입력하면 호출에서 커서가 반환됩니다.self.cursor(); 콘텍스트를 벗어나면commit또는rollback거래 중.커서도 암묵적으로 닫힙니다.

즉, 에 대한 암묵적인 콜은self.commit접속의 실장 컨텍스트에서 벗어나면 트랜잭션의 기존 스냅샷이 '삭제'되고 해당 새로운 스냅샷 생성 전에 커밋이 완료되어 있는 한 루프의 다음 반복에서 강제로 새 스냅샷이 생성됩니다.

했습니다.self.conn.commit()

cursor.cursorall()

언급URL : https://stackoverflow.com/questions/52380528/python-mysql-not-refreshing