Hướng dẫn python close db connection in destructor - python đóng kết nối db trong hàm hủy

Đọc về tuyên bố với tuyên bố. Bạn đang mô tả trường hợp sử dụng của nó.

Bạn sẽ cần kết nối kết nối của mình trong lớp "Trình quản lý bối cảnh" xử lý các phương thức __enter____exit__ được sử dụng bởi câu lệnh with.

Xem PEP 343 để biết thêm thông tin.


Chỉnh sửa

"Đối tượng của tôi không được sử dụng đơn giản như Close mở, nhưng được giữ như một thành viên của một đối tượng khác, lớn hơn"

class AnObjectWhichMustBeClosed( object ):
    def __enter__( self ):
        # acquire
    def __exit__( self, type, value, traceback ):
        # release
    def open( self, dbConnectionInfo ):
        # open the connection, updating the state for __exit__ to handle.

class ALargerObject( object ):
    def __init__( self ):
        pass
    def injectTheObjectThatMustBeClosed( self, anObject ):
        self.useThis = anObject

class MyGuiApp( self ):
    def run( self ):
        # build GUI objects
        large = ALargeObject()
        with AnObjectWhichMustBeClosed() as x:
            large.injectTheObjectThatMustBeClosed( x )
            mainLoop()

Một số người gọi đây là "tiêm phụ thuộc" và "đảo ngược kiểm soát". Những người khác gọi đây là mô hình chiến lược. "ObjectthatMustBeclosed" là một chiến lược, được cắm vào một số đối tượng lớn hơn. Việc lắp ráp được tạo ra ở cấp cao nhất của ứng dụng GUI, vì đó thường là nơi các tài nguyên như cơ sở dữ liệu được mua lại.Strategy pattern. The "ObjectThatMustBeClosed" is a strategy, plugged into some larger object. The assembly is created at a top-level of the GUI app, since that's usually where resources like databases are acquired.

Nó thực sự phụ thuộc vào thư viện bạn đang sử dụng. Một số trong số họ có thể tự đóng kết nối (lưu ý: Tôi đã kiểm tra thư viện SQLite3 tích hợp và không có gì). Python sẽ gọi một kẻ phá hủy khi một đối tượng đi ra khỏi phạm vi và các thư viện này có thể thực hiện một chất hủy diệt đóng các kết nối một cách duyên dáng.

Tuy nhiên, đó có thể không phải là trường hợp! Tôi muốn giới thiệu, như những người khác có trong các bình luận, để bọc nó trong một đối tượng.

class MyDB(object):

    def __init__(self):
        self._db_connection = db_module.connect('host', 'user', 'password', 'db')
        self._db_cur = self._db_connection.cursor()

    def query(self, query, params):
        return self._db_cur.execute(query, params)

    def __del__(self):
        self._db_connection.close()

Điều này sẽ khởi tạo kết nối cơ sở dữ liệu của bạn khi bắt đầu và đóng nó khi nơi mà đối tượng của bạn được khởi tạo nằm ngoài phạm vi. Lưu ý: Nếu bạn khởi tạo đối tượng này ở cấp độ mô -đun, nó sẽ tồn tại cho toàn bộ ứng dụng của bạn. Trừ khi điều này được dự định, tôi sẽ đề nghị tách các chức năng cơ sở dữ liệu của bạn với các chức năng không phải là cơ sở dữ liệu.

May mắn thay, Python đã tiêu chuẩn hóa API cơ sở dữ liệu, vì vậy điều này sẽ hoạt động với tất cả các DB tuân thủ cho bạn :)

❮ Php mysqli tham khảo

Ví dụ - Phong cách định hướng đối tượng

Đóng kết nối cơ sở dữ liệu đã mở trước đó:

$mysqli = new mysqli("localhost","my_user","my_password","my_db");

if ($ mysqli -> connect_errno) {& nbsp; Echo "Không thể kết nối với MySQL:". $ mysqli -> Connect_error; & nbsp; lối ra(); }
  echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
  exit();
}

// .... một số mã PHP ...

$ mysqli -> đóng (); ?>
?>


Nhìn vào ví dụ về phong cách thủ tục ở phía dưới.


Định nghĩa và cách sử dụng

Hàm đóng () / mysqli_close () đóng kết nối cơ sở dữ liệu đã mở trước đó.


Cú pháp

Phong cách định hướng đối tượng:

Phong cách thủ tục:

Giá trị tham số

Tham sốSự mô tả
sự liên quanYêu cầu. Chỉ định kết nối MySQL để đóng

Chi tiết kỹ thuật

Giá trị trở lại:Đúng về thành công. Sai về thất bại
Phiên bản PHP:5+

Ví dụ - Phong cách thủ tục

Đóng kết nối cơ sở dữ liệu đã mở trước đó:

$con=mysqli_connect("localhost","my_user","my_password","my_db");

if ($ mysqli -> connect_errno) {& nbsp; Echo "Không thể kết nối với MySQL:". $ mysqli -> Connect_error; & nbsp; lối ra(); }
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  exit;
}

// .... một số mã PHP ...

mysqli_close ($ con); ?>
?>



❮ Php mysqli tham khảo


Hướng dẫn python close db connection in destructor - python đóng kết nối db trong hàm hủy

Nhỏ bé. Nhanh. Đáng tin cậy.CHOOSE bất kỳ ba.
Choose any three.

Giao diện SQLite C

int sqlite3_close(sqlite3*);
int sqlite3_close_v2(sqlite3*);

Các thói quen sqlite3_close () và sqlite3_close_v2 () là bộ hủy diệt cho đối tượng SQLite3. Các cuộc gọi đến sqlite3_close () và sqlite3_close_v2 () trả về sqlite_ok nếu đối tượng sqlite3 bị phá hủy thành công và tất cả các tài nguyên liên quan đều được giải quyết.

Lý tưởng nhất, các ứng dụng nên hoàn thiện tất cả các câu lệnh đã chuẩn bị, đóng tất cả các tay cầm blob và hoàn thành tất cả các đối tượng sqlite3_backup được liên kết với đối tượng sqlite3 trước khi cố gắng đóng đối tượng. Nếu kết nối cơ sở dữ liệu được liên kết với các câu lệnh được chuẩn bị không chính xác, trình xử lý blob và/hoặc các đối tượng sqlite3_backup chưa hoàn thành thì sqlite3_close () sẽ để kết nối cơ sở dữ liệu mở và trả về sqlite_busy. Sqlite3_close_v2 () được gọi với các câu lệnh được chuẩn bị không chính xác, trình xử lý blob không được xử lý và/hoặc sqlite3_backups chưa hoàn thành, nó sẽ trả về SQLite_OK bất kể, nhưng thay vì xử lý kết nối cơ sở dữ liệu ngay lập tức Tự động phân bổ kết nối cơ sở dữ liệu sau khi tất cả các câu lệnh được chuẩn bị được hoàn tất, tất cả các tay cầm blob đều được đóng và tất cả các bản sao lưu đã hoàn thành. Giao diện SQLite3_Close_v2 () được sử dụng để sử dụng với các ngôn ngữ máy chủ được thu thập và nơi thứ tự được gọi là chất phá hủy được gọi là tùy ý.

Nếu một đối tượng SQLite3 bị phá hủy trong khi giao dịch được mở, giao dịch sẽ tự động quay lại.

Tham số C thành sqlite3_close (c) và sqlite3_close_v2 (c) phải là một con trỏ null hoặc con trỏ đối tượng sqlite3 thu được từ sqlite3_open (), sqlite3_open16 () Gọi sqlite3_close () hoặc sqlite3_close_v2 () với đối số con trỏ null là vô hại.

Xem thêm Danh sách các đối tượng, hằng số và các chức năng.

Làm thế nào để bạn đóng kết nối cơ sở dữ liệu trong Python?

Để ngắt kết nối cơ sở dữ liệu, hãy sử dụng phương thức Close ().Nếu kết nối với cơ sở dữ liệu được đóng bởi người dùng bằng phương thức đóng (), mọi giao dịch nổi bật sẽ được DB quay lại.use close() method. If the connection to a database is closed by the user with the close() method, any outstanding transactions are rolled back by the DB.

Làm thế nào để bạn đóng một đối tượng kết nối trong Python?

Làm thế nào để bạn đóng một kết nối và con trỏ trong Python?đóng () phương thức.Sử dụng Close () khi bạn hoàn thành bằng cách sử dụng con trỏ.Phương pháp này đóng con trỏ, đặt lại tất cả các kết quả và đảm bảo rằng đối tượng con trỏ không có tham chiếu đến đối tượng kết nối ban đầu của nó.close() Method. Use close() when you are done using a cursor. This method closes the cursor, resets all results, and ensures that the cursor object has no reference to its original connection object.

__ del __ trong Python là gì?

Phương pháp __del __ () là một phương pháp phá hủy.Nó được gọi là khi một đối tượng được thu thập rác xảy ra sau khi tất cả các tham chiếu đến đối tượng đã bị xóa.a destructor method. It is called when an object is garbage collected which happens after all references to the object have been deleted.

Làm thế nào để Python quản lý kết nối cơ sở dữ liệu?

Để tạo kết nối giữa cơ sở dữ liệu MySQL và Python, phương thức Connect () của mô -đun mysql.connector được sử dụng.Chúng tôi vượt qua các chi tiết cơ sở dữ liệu như tên máy chủ, tên người dùng và mật khẩu trong lệnh gọi phương thức và sau đó phương thức trả về đối tượng kết nối.the connect() method of mysql. connector module is used. We pass the database details like HostName, username, and the password in the method call, and then the method returns the connection object.