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
'programing' 카테고리의 다른 글
FFmpeg C API 매뉴얼/튜토리얼 (0) | 2022.09.19 |
---|---|
'isPresent' 체크 없이 'Optional.get()'을 클릭합니다. (0) | 2022.09.19 |
'DOMWindow'에서 'postMessage'를 실행하지 못했습니다. https://www.youtube.com !== http://localhost:9000 (0) | 2022.09.19 |
인덱스에도 불구하고 쿼리 성능이 느리다 (0) | 2022.09.12 |
JDBC DatabaseMetaData#getTables()가 반환됨: ERROR 1463(42000):HAVING 절에 그룹화되지 않은 필드 'TABLE_TYPE'이 사용됩니다. (0) | 2022.09.12 |