Требуется подключение к БД Azure SQL во многих модулях - как? - PullRequest
0 голосов
/ 22 февраля 2020

Я написал инструмент Python с wx Python GUI, основной задачей которого является получение большого количества пользовательского ввода в отношении данных клиента, данных о продукте и т. Д. И его сохранение в базе данных SQL в данный момент локально с базой данных SQLite3 для тестирования, которое теперь переключается на MS Azure, чтобы кто-нибудь работал в той же базе данных

Поскольку я сейчас планирую использовать базу данных MS Azure SQL, у меня есть несколько вопросов, и я надеюсь, что это правильное место, чтобы спросить:

  1. Что такое лучшая библиотека для подключения к Azure через Python? Я нашел pyodbc и pymssql, но я думаю, что оба должны иметь дополнительный драйвер? Это правда, и это проблема в реальных случаях использования?
  2. У меня много модулей, таких как Manage_Customer.py и Manage_Factory.py и так далее. Во всех них я подключаюсь к своей базе данных. У меня нет модуля, похожего на SQL Master, который обрабатывает некоторые накладные расходы.

Таким образом, мой код выглядит в большинстве случаев так:

import wx
import sqlite3

SQL_PATH = "Database_Test.db"

class ManageCustomerToDB(wx.Dialog):

    def __init__(self, *args, **kw):
        super(ManageCustomerToDB, self).__init__(*args, **kw)

    def InitUI(self):
    #[GUI an so on...]

        # I do this on time inside a module:
        conn = sqlite3.connect(SQL_PATH)
        self.c = conn.cursor()  

        # Use functions like the ones below...


    def GetCustomerData(self):
        self.c.execute("SELECT * FROM Customer WHERE CustomerID = ?", (self.tc_customer_id.GetValue(),)) 
        customer_data = self.c.fetchall()

        # Do something with Customer Data

    def GetPersonData(self):
        self.c.execute("SELECT * FROM Person WHERE PersonID = ?", (self.tc_person_id.GetValue(),)) 
        person_data = self.c.fetchall()

        # Do something with Person Data

Надеюсь, этот пример показывает, что я делаю. Есть ли еще большие ошибки, которые я делаю?

После прочтения в SQL Мне не нужно каким-либо образом закрывать БД?

Спасибо за вашу помощь и дайте мне знать, если я могу улучшить свой вопрос или дать более подробную информацию.

1 Ответ

1 голос
/ 24 февраля 2020

Не стоит создавать новое соединение с Azure SQL каждый раз, когда вы CRUD. Это пустая трата ресурсов, и когда количество обращений достигнет определенного числа, это будет иметь большое влияние на производительность ms sql.

. Я предлагаю вам использовать пул соединений с базой данных. Диспетчер пула инициализирует несколько соединений с SQL экземпляром сервера, а затем повторно использует эти соединения по запросу.

Существует пакет, которым вы можете воспользоваться. Это DBUtils . Вы можете использовать PoolDB из него вместе с pyodbc.

Пример для демонстрации работы пула соединений с базой данных:

import pyodbc
from DBUtils.PooledDB import PooledDB


class Database:
    def __init__(self, server, driver, port, database, username, password):
        self.server = server
        self.driver = driver
        self.port = port
        self.database = database
        self.username = username
        self.password = password
        self._CreatePool()

    def _CreatePool(self):
        self.Pool = PooledDB(creator=pyodbc, mincached=2, maxcached=5, maxshared=3, maxconnections=6, blocking=True, DRIVER=self.driver, SERVER=self.server, PORT=self.port, DATABASE=self.database, UID=self.username, PWD=self.password)

    def _Getconnect(self):
        self.conn = self.Pool.connection()
        cur = self.conn.cursor()
        if not cur:
            raise "connection error"
        else:
            return cur
    # query sql

    def ExecQuery(self, sql):
        cur = self._Getconnect()
        cur.execute(sql)
        relist = cur.fetchall()
        cur.close()
        self.conn.close()
        return relist
    # non-query sql

    def ExecNoQuery(self, sql):
        cur = self._Getconnect()
        cur.execute(sql)
        self.conn.commit()
        cur.close()
        self.conn.close()


def main():

    server = 'jackdemo.database.windows.net'
    database = 'jackdemo'
    username = 'jack'
    port=1433
    password = '*********'
    driver= '{ODBC Driver 17 for SQL Server}'
    ms = Database(server=server, driver=driver, port=port, database=database, username=username, password=password)

    resList = ms.ExecQuery("select * from Users")

    print(resList)


if __name__ == '__main__':

    main()


Ответы на ваши вопросы:

Q1: Какая библиотека лучше всего подходит для подключения Azure через Python? Я нашел pyodb c и pyms sql, но я думаю, что оба должны иметь дополнительный драйвер? Это правда, и это проблема в реальных случаях использования?

Ответ: Тогда оба будут в порядке. ODB C означает Open Database Connectivity, поэтому его можно использовать для подключения многих баз данных. Я вижу, что в руководстве Microsoft используется pyodbc, поэтому, возможно, это лучший выбор.

Q2: У меня много модулей, таких как Manage_Customer.py, Manage_Factory.py и так далее. Во всех них я подключаюсь к своей базе данных. У меня нет модуля, похожего на SQL Master, который обрабатывает некоторые накладные расходы.

Ответ: Используйте пул соединений с базой данных.

Q3: После чтения в SQL Мне не нужно закрывать БД каким-либо образом?

Ответ: Если вы используете пул соединений с базой данных, то соединение будет также возвращено к пулу после вызова метода close ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...