正确的方法使用PYODBC从SQL查询中填写列表



这是从Python 2.7中的SQL查询获取列表的正确方法吗?使用循环似乎有些虚假。有更好的方法吗?

import numpy as np
import pyodbc as SQL
from datetime import datetime
con = SQL.connect('Driver={SQL Server};Server=MyServer; Database=MyDB; UID=MyUser; PWD=MyPassword')
cursor = con.cursor()
#Function to convert the unicode dates returned by SQL Server into Python datetime objects
ConvertToDate = lambda s:datetime.strptime(s,"%Y-%m-%d")
#Parameters
Code = 'GBPZAR'
date_query = '''
             SELECT DISTINCT TradeDate 
             FROM MTM 
             WHERE Code = ? 
               and TradeDate > '2009-04-08' 
             ORDER BY TradeDate
            '''
#Get a list of dates from SQL
cursor.execute(date_query, [Code])
rows = cursor.fetchall()
Dates = [None]*len(rows) #Initialize array
r = 0
for row in rows:
    Dates[r] = ConvertToDate(row[0])
    r += 1

编辑:

当我想将查询放入结构化数组中何时呢?目前,我做这样的事情:

#Initialize the structured array
AllData = np.zeros(num_rows, dtype=[('TradeDate', datetime),
                                    ('Expiry', datetime), 
                                    ('Moneyness', float),
                                    ('Volatility', float)])
#Iterate through the record set using the cursor and populate the structure array
r = 0
for row in cursor.execute(single_date_and_expiry_query, [TradeDate, Code, Expiry]):
    AllData[r] = (ConvertToDate(row[0]), ConvertToDate(row[1])) + row[2:] #Convert th0e date columns and concatenate the numeric columns
    r += 1

无需预先创建列表,您可以使用list.append()。这也避免了必须将索引与Dates保持一致。

我将在这里使用列表理解,在光标上直接循环以获取行:

cursor.execute(date_query, [Code])
Dates = [datetime.strptime(r[0], "%Y-%m-%d") for r in cursor]

您可能需要将.date()添加到datetime.strptime()结果中以获取datetime.date对象。

在光标上迭代是可取的,因为它避免将所有行作为列表加载到内存中,而只是用另一个处理的日期列表替换该列表。请参阅cursor.fetchall()文档:

由于这将所有行读为内存,因此如果有很多行,则不应使用它。考虑在行上迭代。

要产生您的numpy.array,请不要预先填充。而是在发电机的帮助下使用numpy.asarray()将光标项目变成数组:

dtype=[('TradeDate', datetime), ('Expiry', datetime), 
       ('Moneyness', float), ('Volatility', float)]
dt = lambda v: datetime.strptime(v, "%Y-%m-%d")
filtered_rows = ((dt(r[0]), dt(r[1]) + r[2:]) for r in cursor)
all_values = np.asarray(filtered_rows, dtype=dtype)

供将来参考,您可以使用 enumerate()产生循环的计数器:

for r, row in enumerate(rows):
    # r starts at 0 and counts along

相关内容

  • 没有找到相关文章

最新更新