programing

MySQL에서 sqlalchemy 연결을 닫는 방법

luckcodes 2022. 10. 8. 10:11

MySQL에서 sqlalchemy 연결을 닫는 방법

실행하려는 샘플 코드는 다음과 같습니다.

for i in range(1,2000):
    db = create_engine('mysql://root@localhost/test_database')
    conn = db.connect()
    #some simple data operations
    conn.close()
    db.dispose()

MySQL에서 "Too many connections" 오류를 표시하지 않고 실행할 수 있는 방법이 있습니까?그렇지 않으면 연결을 처리할 수 있거나 연결 풀을 가질 수 있다는 것을 이미 알고 있습니다.squalchemy의 연결을 제대로 닫는 방법을 알고 싶습니다.잘 부탁드립니다!

이 코드를 올바르게 쓰는 방법은 다음과 같습니다.

db = create_engine('mysql://root@localhost/test_database')
for i in range(1,2000):
    conn = db.connect()
    #some simple data operations
    conn.close()
db.dispose()

즉,Engine는 접속의 팩토리이며 접속의 풀이기도 합니다.접속 자체가 아닙니다.당신이 말할 때conn.close()접속은 실제로는 닫히지 않고 엔진 내의 연결 풀로 돌아갑니다.

연결을 실제로 닫는 경우(풀링되지 않음),NullPool:

from sqlalchemy.pool import NullPool
db = create_engine('mysql://root@localhost/test_database', poolclass=NullPool)

상기와 함께Engine설정, 각 콜의conn.close()기본 DBAPI 연결이 닫힙니다.

OTOH가 실제로 각 콜의 다른 데이터베이스(즉, 하드 코드)에 접속하는 경우"localhost/test_database"하나의 예에 불과하고 실제로 많은 다른 데이터베이스를 가지고 있습니다.그리고 이 접근방식은dispose()정상입니다. 풀에서 체크 아웃되지 않은 모든 연결이 닫힙니다.

위의 모든 경우에서 중요한 것은,Connection오브젝트가 닫힙니다.close(). 어떤 종류의 "접속 없는" 실행을 사용하고 있다면,engine.execute()또는statement.execute(),그ResultProxy실행 콜에서 반환된 오브젝트는 완전히 읽어야 합니다.그렇지 않으면 를 통해 명시적으로 닫아야 합니다.close().aConnection또는ResultProxy아직 열려 있는 것은NullPool또는dispose()모든 마지막 연결을 닫는 것으로부터 접근합니다.

관련성이 없는 문제로 데이터베이스와의 접속을 끊는 해결책을 찾으려고 했다(포킹하기 전에 접속을 끊어야 한다).

연결 풀에서도 연결을 비활성화해야 합니다.

이 예에서는 다음과 같습니다.

for i in range(1,2000):
    db = create_engine('mysql://root@localhost/test_database')
    conn = db.connect()
    # some simple data operations
    # session.close() if needed
    conn.invalidate()
    db.dispose()

이걸로 할게요.

engine = create_engine('...')
with engine.connect() as conn:
    conn.execute(text(f"CREATE SCHEMA IF NOT EXISTS...")
engine.dispose()

내 경우 항상 작동하며 닫을 수 있습니다!따라서 close() 전에 invalidate()를 사용하여 트릭을 만듭니다.그렇지 않으면 close()는 최악입니다.

conn = engine.raw_connection()  
conn.get_warnings  = True
curSql = xx_tmpsql
myresults = cur.execute(curSql, multi=True)
print("Warnings: #####")
print(cur.fetchwarnings())
for curresult in myresults:
    print(curresult)
    if curresult.with_rows:
        print(curresult.column_names)
        print(curresult.fetchall())
    else:
        print("no rows returned")
cur.close()
conn.invalidate()
conn.close()     
engine.dispose()

언급URL : https://stackoverflow.com/questions/8645250/how-to-close-sqlalchemy-connection-in-mysql