分析、机器学习、Web开发的全明星优秀语言,而SQL是数据库的事实标准。如果将两者结合起来会发生什么?实际上,将两者结合起来并不难。我们可以快速利用Python的动态特性来控制和构建SQL查询。设置完成后,我们不需要做任何事情。这两个工具的结合可谓是最强搭档,自动化和效率更上一层楼。pyodbc连接这两种技术的桥梁是pyodbc,一个可以轻松访问ODBC数据库的库。ODBC(OpenDatabaseConnectivity的缩写)是一种用于访问数据库的标准化应用程序编程接口(API),由SQLAccess小组在90年代初开发。兼容的数据库管理系统(DBMS)包括:IBMDb2MySQLOracleMSAccessMSSQLServer本文将使用MSSQLServer。在大多数情况下,该服务器可以直接与任何符合ODBC的数据库一起使用。唯一需要更改的是连接设置。连接首先,创建与SQLserver的连接,可以通过pyodbc.connect来实现。在此函数中,还必须传递连接字符串。此连接字符串必须指定DBMS驱动程序、服务器、要连接到的特定数据库以及连接设置。所以,假设要连接服务器UKXXX00123,45600和数据库DB01,需要使用SQLServerNativeClient11.0。从内部连接使连接可信,无需输入用户名和密码。cnxn_str=("Driver={SQLServerNativeClient11.0};""Server=UKXXX00123,45600;""Database=DB01;""Trusted_Connection=yes;")现在,连接初始化为:cnxn=pyodbc.connect(cnxn_str)如果在没有受信任连接的情况下访问数据库,需要输入通常用于通过SQLServerManagementStudio(SSMS)访问服务器的用户名和密码。例如,如果您的用户名是JoeBloggs,密码是Password123,您应该立即更改密码。修改密码之前,可以这样连接:cnxn_str=("Driver={SQLServerNativeClient11.0};""Server=UKXXX00123,45600;""Database=DB01;""UID=JoeBloggs;""PWD=Password123;")cnxn=pyodbc.connect(cnxn_str)现在我们已经连接到数据库了,我们可以开始通过Python执行SQL查询了。执行查询在SQL服务器上运行的每个查询都包含游标初始化和查询执行。如果要在服务器内部进行任何更改,还需要将这些更改提交到服务器。首先初始化游标:cursor=cnxn.cursor()现在,每当要执行查询时,都会使用这个游标对象。从名为“customers”的表中选择前1000行:cursor.execute("SELECTTOP(1000)*FROMcustomers")执行此操作,但这发生在服务器内部,实际上没有任何内容返回给Python。我们来看看这些从SQL中提取出来的数据。提取数据要将数据从SQL提取到Python中,需要使用pandas。Pandas提供了一个非常方便的函数read_sql,可以从SQL中读取数据。read_sql需要查询并加入实例cnxn,如下所示:data=pd.read_sql("SELECTTOP(1000)*FROMcustomers",cnxn)这将返回一个数据框,其中包含来自“customers”表的前1000行。在SQL中更改数据现在,如果要在SQL中更改数据,则需要在最初的初始连接之后再添加一个步骤,并执行查询过程。在SQL中执行查询时,这些更改会保存在临时空间中,而不是直接对数据进行更改。为了使更改成为永久更改,必须提交更改。连接firstName和lastName列以创建fullName列。cursor=cnxn.cursor()#firstaterthetable,addingacolumncursor.execute("ALTERTABLEcustomer"+"ADDfullNameVARCHAR(20)")#nowupdatethatcolumntocontainfirstName+lastNamecursor.execute("UPDATEcustomer"+"SETfullName=firstName+""+lastName")此时,数据库中不存在全名。必须提交这些更改才能使更改永久生效:cnxn.commit()下一步,一旦执行了任何需要执行的操作任务,就可以将数据提取到Python中,或者将数据提取到Python中进行操作Python。无论采用哪种方法,一旦在Python中拥有数据,就可以做很多以前做不到的事情。也许需要执行一些日常报告,通常使用要查询的SQL服务器的最新数据,计算基本统计数据,并将结果通过电子邮件发送。如何如何自动化自动化这?")#converttoformatyyyy-mm-ddcnxn=pyodbc.connect(cnxn_str)#initialiseconnection(assumewehavealreadydefinedcnxn_str)#buildupourquerystringquery=("SELECT*FROMcustomers"f"WHEREjoinDate>'{date}'")#executethequeryandreadtoadataframeinPythondata=pd.read_sql(query,cnxn))delcnxn#closetheconnection#makeafewcalculationsmean_payment=data['payment'].mean()std_payment=data['payment'].std()#getmaxpaymentandproductdetailsmax_vals=data[['product','payment']].sort_values(by=['payment'],ascending=False).iloc[0]#writeanemailmessagetxt=(f"Customerreportingforperiod{date}-{datetime.today().strftime('%Y-%m-%d')}。\n\n"f"Meanpaymentamountsreceived:{mean_payment}\n"f"Standarddeviationofpaymentamounts:{std_payments}\n"f"Highestpaymentamountof{max_vals['payment']}"f"receivedfrom{max_vals['product']}product.")#wewillbuiltthemessageusingtheemailibraryandsendusingsmt(()#sayhellototheserversmtp.starttls()#wewillcommunicateusingTLSencryption#logintooutlookserver,usinggenericemailandpasswordsmtp.login('joeloggs@outlook.com','Password123')#sendemailtoourbosssmtp.sendmail('joeloggs@outlook.com','joeloggsboss@ms_stringoutl().as)#finally,disconnectfromthemailserversmtp.quit()至此,任务结束!运行这段代码可以快速提取上周的数据,计算关键指标,并将总结发送给老板。通过简单的步骤,我们学会了如何使用SQLIntegrationwithPython快速构建更高效、自动化的工作流,不仅可以用于本例,还有很多用途等着你去开发。Python开辟了新天地,完成了以前单独使用SQL无法完成的事情。这对最强的正式比赛达到了1+1大于2的效果。
