我编写了一个带有 wxPython GUI 的 Python 工具,它的主要任务是获取大量有关客户数据、产品数据等的用户输入,并将其保存到 SQL 数据库,目前在本地使用 SQLite3 数据库用于测试现在切换到 MS Azure 让任何人在同一个数据库中工作。
由于我现在计划使用 MS Azure SQL DB,所以我有几个问题,我希望这是正确的提问地点:
- 通过 Python 连接到 Azure 的最佳库是什么?我发现
pyodbc
和pymssql
但我认为两者都需要有一个额外的驱动程序 安装了?这是真的吗?这在实际用例中是一个问题吗? - 我有很多模块,例如
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 后我不需要以任何方式关闭数据库?
感谢您的帮助,如果我可以改进我的问题或提供更多详细信息,请告诉我。
最佳答案
每次执行 CRUD 时都创建与 Azure SQL 的新连接并不是一个好主意。这是一种资源的浪费,而且当访问次数达到一定数量时,会对mssql的性能产生很大的影响。
我建议你使用数据库连接池。池管理器将初始化与 SQL Server 实例的多个连接,然后在请求时重用这些连接。
有一个现有的软件包可供您利用。是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:通过 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/