sql >> Database teknologi >  >> RDS >> Mysql

Sådan lukkes sqlalchemy-forbindelsen i MySQL

Sådan skriver du den kode korrekt:

db = create_engine('mysql://[email protected]/test_database')
for i in range(1,2000):
    conn = db.connect()
    #some simple data operations
    conn.close()
db.dispose()

Det vil sige Engine er en fabrik til forbindelser samt en pulje af forbindelser, ikke selve forbindelsen. Når du siger conn.close() , returneres forbindelsen til forbindelsespuljen i motoren , faktisk ikke lukket.

Hvis du ønsker, at forbindelsen rent faktisk skal lukkes, dvs. ikke samles, skal du deaktivere pooling via NullPool :

from sqlalchemy.pool import NullPool
db = create_engine('mysql://[email protected]/test_database', poolclass=NullPool)

Med ovenstående Engine konfiguration, hvert kald til conn.close() vil lukke den underliggende DBAPI-forbindelse.

Hvis OTOH du faktisk ønsker at oprette forbindelse til andre databaser på hvert opkald, det vil sige din hårdkodede "localhost/test_database" er bare et eksempel, og du har faktisk mange forskellige databaser, så er fremgangsmåden ved hjælp af dispose() er fint; det vil lukke alle forbindelser, der ikke er tjekket ud fra poolen.

I alle ovenstående tilfælde er det vigtige, at Connection objekt lukkes via close() . Hvis du bruger nogen form for "forbindelsesfri" udførelse, det er engine.execute() eller statement.execute() , ResultProxy objekt, der returneres fra det eksekveringskald, skal læses fuldt ud eller på anden måde eksplicit lukkes via close() . En Connection eller ResultProxy som stadig er åben vil forbyde NullPool eller dispose() nærmer sig fra at lukke hver sidste forbindelse.



  1. Oracle High Availability-koncepter i PostgreSQL

  2. 2 måder at returnere Unix-tidsstemplet i SQLite

  3. Sådan bruger du INNER JOIN i SQL

  4. stop ved kompileringsfejl i et sqlplus-script