Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Manajemen sumber daya database yang tepat:kursor dan koneksi

Ini terdengar seperti kasus penggunaan yang bagus untuk python pengelola konteks . Pengelola Konteks memungkinkan Anda untuk mengelola sumber daya dengan benar , seperti koneksi database, dengan memungkinkan Anda menentukan cara kerja metode penyiapan dan pembongkaran sumber daya . Anda dapat membuat pengelola konteks kustom Anda sendiri dengan salah satu dari dua cara:Pertama, dengan membungkus kelas database Anda, dan menerapkan metode yang diperlukan untuk pengelola konteks:__init__() , __enter__() , dan __exit__() . Kedua, dengan memanfaatkan @contextmanager dekorator pada definisi fungsi dan membuat generator untuk sumber daya database Anda dalam definisi fungsi tersebut. Saya akan menunjukkan kedua pendekatan dan membiarkan Anda memutuskan mana yang menjadi preferensi Anda. __init__() metode ini adalah metode inisialisasi untuk pengelola konteks khusus Anda, mirip dengan metode inisialisasi yang digunakan untuk kelas python khusus. __enter__() metode adalah kode penyiapan . Anda untuk pengelola konteks khusus Anda. Terakhir, __exit()__ metode ini adalah penghancuran . Anda kode untuk pengelola konteks khusus Anda. Kedua pendekatan menggunakan metode ini dengan perbedaan utama adalah metode pertama akan secara eksplisit menyatakan metode ini dalam definisi kelas Anda. Sedangkan pada pendekatan kedua, semua kode hingga yield generator generator Anda pernyataan adalah kode inisialisasi dan pengaturan dan semua kode setelah yield pernyataan adalah kode pembongkaran Anda. Saya juga akan mempertimbangkan untuk mengekstrak tindakan basis data berbasis pengguna Anda ke dalam kelas model pengguna juga. Sesuatu di sepanjang baris:

pengelola konteks khusus:(pendekatan berbasis kelas ):

import pymysql

class MyDatabase():
    def __init__(self):
        self.host = '127.0.0.1'
        self.user = 'root'
        self.password = ''
        self.db = 'API'

        self.con = None
        self.cur = None

    def __enter__(self):
        # connect to database
        self.con = pymysql.connect(host=self.host, user=self.user, password=self.password, db=self.db, cursorclass=pymysql.cursors.DictCursor, autocommit=True)
        self.cur = self.con.cursor()
        return self.cur

    def __exit__(self, exc_type, exc_val, traceback):
        # params after self are for dealing with exceptions
        self.con.close()

user.py (difaktorkan ulang) :'

# import your custom context manager created from the step above
# if you called your custom context manager file my_database.py: from my_database import MyDatabase

import <custom_context_manager>

class User:
    def getUser(self, id):
        sql = 'SELECT * from users where id = %d'
        with MyDatabase() as db: 
            db.execute(sql, (id))
            result = db.fetchall()

        return result

    def getAllUsers(self):
        sql = 'SELECT * from users'
        with MyDatabase() as db: 
            db.execute(sql)
            result = db.fetchall()
        return result

    def AddUser(self, firstName, lastName, email):
        sql = "INSERT INTO `users` (`firstName`, `lastName`, `email`) VALUES (%s, %s, %s)"
        with MyDatabase() as db:
            db.execute(sql, (firstName, lastName, email))

pengelola konteks (pendekatan dekorator) :

from contextlib import contextmanager
import pymysql


@contextmanager
def my_database():
    try:
        host = '127.0.0.1'
        user = 'root'
        password = ''
        db = 'API'
        con = pymysql.connect(host=host, user=user, password=password, db=db, cursorclass=pymysql.cursors.DictCursor, autocommit=True)
        cur = con.cursor()
        yield cur
    finally:
        con.close()

Kemudian di dalam User . Anda kelas Anda dapat menggunakan manajer konteks dengan terlebih dahulu mengimpor file dan kemudian menggunakannya seperti sebelumnya:

with my_database() as db:
   sql = <whatever sql stmt you wish to execute>
   #db action 
   db.execute(sql)

Semoga membantu!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - Kunci asing saat hapus setel nol di bidang bukan nol

  2. Pemicu MySQL Pada acara Sisipkan/Perbarui

  3. Saat memesan berdasarkan desc tanggal, Menggunakan permintaan memperlambat sementara

  4. Cari matriks untuk semua persegi panjang dari dimensi yang diberikan (pilih blok kursi)

  5. Tidak dapat mengakses database Google Cloud SQL dari App Engine saya