# -*- coding: utf-8 -*-
"""
Created on Thu Dec 27 13:45:23 2018
@author: zhanggl21
"""
'''
Sql中的游标是干嘛的?
在数据库中,游标提供了一种对从表中检索出的数据进行操作的灵活手段。
就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取
一条记录的机制。
游标总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或
由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。
游标关于数据库中的操作会对整个行集产生影响。由 SELECT 语句返回的行集
包括所有满足该语句 WHERE 子句中条件的行。由语句所返回的这一完整的行集被称为结果集。
应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元
来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。
游标就是提供这种机制的结果集扩展。
游标通过以下方式扩展结果处理:
1.允许定位在结果集的特定行。
2.从结果集的当前位置检索一行或多行。
3.支持对结果集中当前位置的行进行数据修改。
4.为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。
5.提供脚本、存储过程和触发器中使用的访问结果集中的数据的 Transact-SQL 语句。
'''
import pyodbc
# 数据库服务器信息
driver = 'SQL Server'
server = 'SHCWSYWFZ46T'
user = 'sa'
password = 'sh.0628'
database = 'zyroi'
#连接数据库
conn = pyodbc.connect(driver=driver, server=server, user=user, \
password=password, database=database)
'''
把数据存储到excel有两种方法
'''
'''方法一:
使用pandas的read_sql将select查询结果存到DataFrame里面并导出到excel
'''
import pandas as pd
df=pd.read_sql(sql="SELECT top 1000 * FROM\
zyroi.dbo.[roi]\
order by 月份 DESC",con=conn)
df.to_excel(r'd:\Users\zhanggl21\Desktop\清洗电话表取数.xlsx')
'''方法二:
利用循环和excel包
'''
cur = conn.cursor()
sql = 'select top 100 * from [201711qxcall]' # 查询语句
cur.execute(sql)
rows = cur.fetchall() #获得所有数据,返回一个list对象,每行就是一个tuple元组
#关闭数据库连接
conn.close()
import xlwt
wk=xlwt.Workbook()
sht=wk.add_sheet('database',cell_overwrite_ok=False)
#记录字段名称信息(表的列名)
biaoti=cur.description
# 写上字段信息
for bt in range(0,len(biaoti)):
sht.write(0,bt,biaoti[bt][0])
help(sht.write)
# 获取并写入数据段信息
row = 1
col = 0
for row in range(1,len(rows)+1):
for col in range(0,len(biaoti)):
sht.write(row,col,u'%s' %(rows[row-1][col]))
wk.save(r'd:\Users\zhanggl21\Desktop\sy.xls')