我在个人电脑上运行着mssql 2005数据库,希望能在其中运行一些Python脚本,并对其中的数据进行简单处理。我想运行一些select语句来获取数据,并可能让Python将结果保存为文本文件。
不幸的是,虽然我对Python和数据库都有一些了解,但很难仅凭阅读就确定一个库是否符合我的要求。理想情况下,我希望找到一个可以用于其他版本的mssql,免费且可商业使用的授权,使用简单,并且可能与IronPython兼容的库。
我在个人电脑上运行着mssql 2005数据库,希望能在其中运行一些Python脚本,并对其中的数据进行简单处理。我想运行一些select语句来获取数据,并可能让Python将结果保存为文本文件。
不幸的是,虽然我对Python和数据库都有一些了解,但很难仅凭阅读就确定一个库是否符合我的要求。理想情况下,我希望找到一个可以用于其他版本的mssql,免费且可商业使用的授权,使用简单,并且可能与IronPython兼容的库。
其他人似乎已经覆盖了cPython -> SQL Server方面的内容。如果想使用IronPython,可以使用标准的ADO.NET API与数据库通信:
import clr
clr.AddReference('System.Data')
from System.Data.SqlClient import SqlConnection, SqlParameter
conn_string = 'data source=<machine>; initial catalog=<database>; trusted_connection=True'
connection = SqlConnection(conn_string)
connection.Open()
command = connection.CreateCommand()
command.CommandText = 'select id, name from people where group_id = @group_id'
command.Parameters.Add(SqlParameter('group_id', 23))
reader = command.ExecuteReader()
while reader.Read():
print reader['id'], reader['name']
connection.Close()
如果你已经安装了IronPython,那么你不需要再安装其他任何东西。
pyodbc内置于Activestate Python中,可以从这里下载。连接到SQL Server 2005数据库的最简ODBC脚本如下:
import odbc
CONNECTION_STRING="""
Driver={SQL Native Client};
Server=[Insert Server Name Here];
Database=[Insert DB Here];
Trusted_Connection=yes;
"""
db = odbc.odbc(CONNECTION_STRING)
c = db.cursor()
c.execute ('select foo from bar')
rs = c.fetchall()
for r in rs:
print r[0]
我也成功地使用了 pymssql 与 CPython(包括使用 SQLAlchemy 和不使用 SQLAlchemy)。
PyPyODBC (http://code.google.com/p/pypyodbc)可以在PyPy、Ironpython和CPython下使用。
这篇文章展示了如何在Python中访问mssql的Hello World样例。
PyPyODBC与pyodbc的使用方法几乎相同,因为它可以被看作是pyodbc模块的重新实现。由于它是纯Python编写的,所以也可以在IronPython和PyPy上运行。
实际上,在现有脚本中切换到pypyodbc后,您可以这样做:
#import pyodbc <-- Comment out the original pyodbc importing line
import pypyodbc as pyodbc # Let pypyodbc "pretend" the pyodbc
pyodbc.connect(...) # pypyodbc has 99% same APIs as pyodbc
...
def getSQLServerDriver():
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\ODBC\ODBCINST.INI")
sqlServerRegExp = re.compile('sql.*server', re.I | re.S)
try:
for i in range(0, 2048):
folder = winreg.EnumKey(key, i)
if sqlServerRegExp.match(folder):
return folder.strip()
except WindowsError:
pass
dbString = "Driver={SQLDriver};Server=[SQL Server];Database=[Database Name];Trusted_Connection=yes;".replace('{SQLDriver}', '{' + getSQLServerDriver() + '}')
这种方法有很多缺点。它不太灵活,因为只支持ODBC API 1,而且我在API或ODBC驱动中遇到了一些小错误,但在Windows的所有版本的CPython中确实可以完成工作。