ich hätte eine kurze und allgemeine Frage zur Verwendung von with und closing.
Diese beiden Funktionen werden ja verwendet um Ressourcen nach deren Verwendung wieder frei zu geben.
Meine Frage dazu ist, wann verwende ich nun genau with open(.....), bzw. with closing(...).
In einem Post auf Stackoverflow wurde gesagt dies ist abhängig von dem was verwendet wird.
Mich interessiert dies in Verwendung mit MYSQL Datenbanken, bzw. mit SQLAlchemy.
Aus einer früheren Frage von mir habe ich von __blackjack__ eine Möglichkeit gezeigt bekommen,
wie man eine Datenbankverbindung mit "with closing" herstellt. (siehe unten)
Code: Alles auswählen
#!/usr/bin/env python3
from contextlib import closing
import mysql.connector
from mysql.connector import errorcode
def erstelle_datenbankverbindung(hostname, username, password, database):
"""
Erstellt die Verbindung zum angegeben Datenbankserver mit dem angegebenen
Benuternamen und dem entsprechenden Passwort.
Es wird dabei die angegebene Datenbank geöffnet und gegebenfalls erstellt
falls es sie noch nicht gibt.
"""
try:
return mysql.connector.connect(
host=hostname,
user=username,
passwd=password,
database=database,
)
except mysql.connector.Error as err:
if err.errno == errorcode.ER_BAD_DB_ERROR:
verbindung = verbindung = mysql.connector.connect(
host=hostname, user=username, passwd=password
)
verbindung.cursor().execute(f"CREATE DATABASE {database}")
return verbindung
else:
raise
def main():
with closing(
erstelle_datenbankverbindung(
"localhost", "root", "passwort", "tabellenname"
)
) as verbindung:
#
# TODO UNIQUE für die Kombination von Vor- und Nachname?
#
verbindung.cursor().execute(
"CREATE TABLE pause ("
" id INTEGER AUTO_INCREMENT PRIMARY KEY"
" vorname VARCHAR(30) NOT NULL,"
" nachname VARCHAR(30) NOT NULL"
")"
)
zu Beginn des Programms eine Verbindung zur Datenbank und wird nur das Cursor-Objekt
geschlossen und wieder geöffnet?
Also ich meine jetzt wie wird dies richtig gehandhabt in einem normalen Programmablauf?
Wenn die Datenbank dauerhaft geöffnet ist, kann es durch einen Absturz zu Datenverlust, bzw.
zur Unbrauchbarkeit führen. Wie beuge ich so etwas vor?
Über Rückmeldungen würde ich mich sehr freuen.
LG