在需要的许多模块中连接到Azure SQL DB-如何



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

当我现在计划使用微软Azure SQL数据库时,我有几个问题,我希望这是一个正确的问题:

  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

我希望这个例子能说明我的所作所为。我还有更大的错误吗?

  1. 在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代表Open Database Connectivity,所以它可以用来连接许多数据库。我看到Microsoft教程使用pyodbc,所以它可能是一个更好的选择。

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

答:使用数据库连接池。

Q3:在SQL中读取后,我不必以任何方式关闭数据库?

答:如果使用数据库连接池,那么在调用close((方法后,连接也会放回池中。

最新更新