python - 许多模块都需要连接到 Azure SQL DB - 如何连接?

标签 python sql azure azure-sql-database

我编写了一个带有 wxPython GUI 的 Python 工具,它的主要任务是获取大量有关客户数据、产品数据等的用户输入,并将其保存到 SQL 数据库,目前在本地使用 SQLite3 数据库用于测试现在切换到 MS Azure 让任何人在同一个数据库中工作。

由于我现在计划使用 MS Azure SQL DB,所以我有几个问题,我希望这是正确的提问地点:

  1. 通过 Python 连接到 Azure 的最佳库是什么?我发现 pyodbcpymssql 但我认为两者都需要有一个额外的驱动程序 安装了?这是真的吗?这在实际用例中是一个问题吗?
  2. 我有很多模块,例如 Manage_Customer.pyManage_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 后我不需要以任何方式关闭数据库?
  • 感谢您的帮助,如果我可以改进我的问题或提供更多详细信息,请告诉我。

    最佳答案

    每次执行 CRUD 时都创建与 Azure SQL 的新连接并不是一个好主意。这是一种资源的浪费,而且当访问次数达到一定数量时,会对mssql的性能产生很大的影响。

    我建议你使用数据库连接池。池管理器将初始化与 SQL Server 实例的多个连接,然后在请求时重用这些连接。

    有一个现有的软件包可供您利用。是DBUtils 。您可以将其中的 PoolDBpyodbc 一起使用。

    展示数据库连接池如何工作的示例:

    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:通过 Python 连接到 Azure 的最佳库是什么?我找到了 pyodbc 和 pymssql 但我认为两者都需要安装额外的驱动程序?这是真的吗?这在实际用例中是一个问题吗?

    答:两者都可以。 ODBC 代表开放数据库连接,因此它可用于连接许多数据库。我看到Microsoft tutorial使用pyodbc,所以也许这是一个更好的选择。

    Q2:我有很多模块,比如 Manage_Customer.py 和 Manage_Factory.py 等等。在所有这些中,我都连接到我的数据库。我没有像 SQL Master 那样处理一些开销的模块。

    答案:使用数据库连接池。

    问题 3:读取 SQL 后我不需要以任何方式关闭数据库?

    答:如果使用数据库连接池,则在调用close()方法后,连接将被放回池中。

    关于python - 许多模块都需要连接到 Azure SQL DB - 如何连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60352147/

    相关文章:

    java - 如何使用 Rest API 或某些 SDK Api 创建 Azure 事件中心

    azure - Azure 虚拟机中 MS SQL 的性能

    python - predict_proba 的 Scikit-learn RandomForestClassifier 输出

    python - 使用 scipy.fftpack.fft 如何解释傅里叶变换的数值结果

    c# - 包含 TableValueParameter 的 Dapper 存储过程

    mysql - 如何对此 MySQL 查询进行 ORDER BY?

    azure - 未找到事件中心资源

    python - 是否可以设置 ipython 来标记完整的函数参数参数

    python - Nginx 不为我的 Flask 网站提供服务

    c# - Entity Framework 连接字符串问题