现有sqlserver表一张 如下图显示

现在要求是 把所有.5的数都加上0.5 然后 将Chinses、Math、English三个数相加除以平均数,根据平均数重新定义等级,并且存到名为test_object的表中
步骤:
1.使用python连接数据库,并从中取该取的数据
2.转换成dataframe并进行处理
3.将处理好的dataframe存入到sqlserver中去

这里需要声明一下,其中会碰到的错误或者做法不妥当的地方 我会直接在文章中写出 并举例出来
提前声明下,取数和最后存入数据库中两个的连接方法是不一样的
一个是pyodc.connect()
一个是create_engine()后续加以说明

直接开始代码 代码中我会尽可能详细的备注 以备你们可以看到 有不理解的地方也可以@我 只要看到会立即回复

# 因为处理的数据并不难,而且使用的方法也比较简单 所以只创建一个类
import pandas
import pandas as pd
import numpy as np
import pyodbc, pymssql, json
from sqlalchemy import types
from sqlalchemy import create_engineclass SqlObj(object):def __init__(self):self.server = Noneself.database = None# 从数据库中取数def get_data_from_sql(self):# 连接数据库Server={服务器名称} Database={数据库名称}conn = pyodbc.connect(r'Driver={SQL Server};Server=服务器名;Database=数据库名;Trusted_Connection=yes;')# 创建游标cursor = conn.cursor()# 写下数据库语言 取数sqlStr = 'select test_name, test_Chinese, test_Math, test_English from [数据库名].[表名]'# 加try:except 会返回哪里错误以便后续查找try:a = cursor.execute(sqlStr)data = a.fetchall()print(data)print(type(data))except Exception as e:print('出错内容:', e)# 设置回滚(如果出错的话)conn.rollback()finally:# 成功的话 关闭连接conn.close()return dataif __name__ == '__main__':cc = SqlObj()cc.get_data_from_sql()


接下来是第一步处理数据,可以将tuple返回为list,然后使用pd.DataFrame()直接处理为dataframe类型

class SqlObj(object):def __init__(self):self.server = Noneself.database = None# 从数据库中取数def get_data_from_sql(self):# 连接数据库Server={服务器名称} Database={数据库名称}conn = pyodbc.connect(r'Driver={SQL Server};Server=服务器名;Database=数据库名;Trusted_Connection=yes;')# 创建游标cursor = conn.cursor()# 写下数据库语言 取数sqlStr = 'select test_name, test_Chinese, test_Math, test_English from [数据库名].[表名]'# 加try:except 会返回哪里错误以便后续查找try:a = cursor.execute(sqlStr)data = a.fetchall()except Exception as e:print('出错内容:', e)# 设置回滚(如果出错的话)conn.rollback()finally:# 成功的话 关闭连接conn.close()return data# 处理数据def handle_sql_data(self):column_name = ['test_name', 'test_Chinese', 'test_Math', 'test_English']# 因为上面return data 所以下面我们可以直接调用SqlObj().get_data_from_sql()进行上一个方法的返回值 也就是tuple的那个data = SqlObj().get_data_from_sql()print('调用get_data_from_sql:', data)# 列表推导式 将tuple()全部转换为listdata = [list(i) for i in data]print('列表推导式之后:', data)df = pd.DataFrame(data, columns=column_name)print('转换为dataframe:', df)print(df)print('----------')print('输出类型:', type(df))return dfif __name__ == '__main__':cc = SqlObj()cc.handle_sql_data()


第二步处理数据 按照要求所有为.5的数据加上0.5 并去三个平均数 重新划分等级

import pandas
import pandas as pd
import pyodbc, pymssql, json
from sqlalchemy import types
from sqlalchemy import create_engineclass SqlObj(object):def __init__(self):self.server = Noneself.database = None# 从数据库中取数def get_data_from_sql(self):# 连接数据库Server={服务器名称} Database={数据库名称}conn = pyodbc.connect(r'Driver={SQL Server};Server=服务器名;Database=数据库名;Trusted_Connection=yes;')# 创建游标cursor = conn.cursor()# 写下数据库语言 取数sqlStr = 'select test_name, test_Chinese, test_Math, test_English from [数据库名].[表名]'# 加try:except 会返回哪里错误以便后续查找try:a = cursor.execute(sqlStr)data = a.fetchall()except Exception as e:print('出错内容:', e)# 设置回滚(如果出错的话)conn.rollback()finally:# 成功的话 关闭连接conn.close()return data# 处理数据def handle_sql_data(self):column_name = ['test_name', 'test_Chinese', 'test_Math', 'test_English']data = SqlObj().get_data_from_sql()data = [list(i) for i in data]df = pd.DataFrame(data, columns=column_name)return dfdef handle_df(self):# 直接从handle_sql_data返回dataframedf = SqlObj().handle_sql_data()print('未修改之前的数据:\n',df)# 所有数据为0.5的数据+0.5def plus_(i):if '.5' in str(i):return i+0.5else:return ifor i in df.columns.tolist()[1:]:df[i] = df[i].apply(plus_)print('+0.5之后:\n',df)#划分等级def changle_level(x,y,z):if (x+y+z) / 3 < 60:return 'D'elif (x+y+z) / 3 < 70:return 'C'elif (x+y+z) / 3 < 80:return 'B'else:return 'A'# 使用的是apply函数# 如果有不太懂得可以问我 也可以查看我的博客有一节是专门将pandas apply函数的df['test_level'] = df.apply(lambda row: changle_level(row['test_Chinese'], row['test_Math'], row['test_English']), axis=1)print('划分等级后:\n', df)return dfif __name__ == '__main__':cc = SqlObj()cc.handle_df()


接下来就是最后一步上传到数据库中
切记一点这个方法是可以不用提前创建数据表,可以直接上传的时候创建数据表,需要注意的是提前要设置好上传类型,
网上有一部分是需要提前创建数据表,但是会产生一个比较难缠的东西就是创建表的时候 会以本地电脑名的前缀作为表的db
如下图显示

下面的就是本地电脑名,而本应该是dbo.开始,所以不建议先创建表
一 使用的函数是

df.to_sql(name='表名', if_exists='append', schema='dbo', con=conn, index=False, dtype=dict)

to_sql为pandas自带的函数,这里不多讲述,可以在官网上进行查看或者查看其他作者的博客,因为没来的更新(尴尬),请原谅
讲下dtype这个参数,可以看到dtype=dict是用来说名后面需是一个字典类型的值,并且是要使用type.()完成创建,下面会有演示

最重要的就是schema这个参数,设置这个参数的值为’dbo’可以解决上述截图的那个问题,不然会直接上传到电脑本地名的那个表中

import pandas
import pandas as pd
import pyodbc, pymssql, json
from sqlalchemy import types
from sqlalchemy import create_engineclass SqlObj(object):def __init__(self):self.server = Noneself.database = None# 从数据库中取数def get_data_from_sql(self):# 连接数据库Server={服务器名称} Database={数据库名称}conn = pyodbc.connect(r'Driver={SQL Server};Server=服务器名;Database=数据库名;Trusted_Connection=yes;')# 创建游标cursor = conn.cursor()# 写下数据库语言 取数sqlStr = 'select test_name, test_Chinese, test_Math, test_English from [数据库名].[表名]'# 加try:except 会返回哪里错误以便后续查找try:a = cursor.execute(sqlStr)data = a.fetchall()except Exception as e:print('出错内容:', e)# 设置回滚(如果出错的话)conn.rollback()finally:# 成功的话 关闭连接conn.close()return data# 处理数据def handle_sql_data(self):column_name = ['test_name', 'test_Chinese', 'test_Math', 'test_English']data = SqlObj().get_data_from_sql()data = [list(i) for i in data]df = pd.DataFrame(data, columns=column_name)return dfdef handle_df(self):# 直接从handle_sql_data返回dataframedf = SqlObj().handle_sql_data()# 所有数据为0.5的数据+0.5def plus_(i):if '.5' in str(i):return i+0.5else:return ifor i in df.columns.tolist()[1:]:df[i] = df[i].apply(plus_)#划分等级def changle_level(x,y,z):if (x+y+z) / 3 < 60:return 'D'elif (x+y+z) / 3 < 70:return 'C'elif (x+y+z) / 3 < 80:return 'B'else:return 'A'df['test_level'] = df.apply(lambda row: changle_level(row['test_Chinese'], row['test_Math'], row['test_English']), axis=1)return dfdef return_dtypes(self):# 从SqlObj().handle_df()返回df 并命名为datadata = SqlObj().handle_df()# 取第一行的值list_data = data.iloc[0,0:]print('第一行的值为Series:\n', list_data)print('--------------------------------')# 因为是Series 所以我们可以取出index和values# 这个是灵活运用的 实际情况看实际情况而定index_ = list_data.index.tolist()print('index的值:\n', index_)print('--------------------------')values_ = list_data.values.tolist()print('values_的值:\n', values_)# 因为函数to_sql,dtype参数是需要字典类型,所以我们创建好dict_,并进行写入dict_ = {}for i in range(len(index_)):if type(values_[i]) == str:dict_[index_[i]] = types.NVARCHAR(length=255)else:dict_[index_[i]] = types.Float()print('返回的dtype参数字典数据:\n',dict_)return dict_if __name__ == '__main__':cc = SqlObj()cc.return_dtypes()


特别需要注意下最后一行输出的,就是我们的列名: 需要上传到数据库的类型
还有datetime、bigint、nvarchar(‘MAX’)等等 视情况而定,主要用到的库是from sqlalchemy import types
网上如果要查看其他类型可以搜索这个就可以看到其他类型
最后一步上传到数据库

import pandas
import pandas as pd
import pyodbc, pymssql, json
from sqlalchemy import types
from sqlalchemy import create_engineclass SqlObj(object):def __init__(self):self.server = Noneself.database = None# 从数据库中取数def get_data_from_sql(self):# 连接数据库Server={服务器名称} Database={数据库名称}conn = pyodbc.connect(r'Driver={SQL Server};Server=服务器名;Database=数据库名;Trusted_Connection=yes;')# 创建游标cursor = conn.cursor()# 写下数据库语言 取数sqlStr = 'select test_name, test_Chinese, test_Math, test_English from [数据库名].[表名]'# 加try:except 会返回哪里错误以便后续查找try:a = cursor.execute(sqlStr)data = a.fetchall()except Exception as e:print('出错内容:', e)# 设置回滚(如果出错的话)conn.rollback()finally:# 成功的话 关闭连接conn.close()return data# 处理数据def handle_sql_data(self):column_name = ['test_name', 'test_Chinese', 'test_Math', 'test_English']data = SqlObj().get_data_from_sql()data = [list(i) for i in data]df = pd.DataFrame(data, columns=column_name)return dfdef handle_df(self):# 直接从handle_sql_data返回dataframedf = SqlObj().handle_sql_data()# 所有数据为0.5的数据+0.5def plus_(i):if '.5' in str(i):return i+0.5else:return ifor i in df.columns.tolist()[1:]:df[i] = df[i].apply(plus_)#划分等级def changle_level(x,y,z):if (x+y+z) / 3 < 60:return 'D'elif (x+y+z) / 3 < 70:return 'C'elif (x+y+z) / 3 < 80:return 'B'else:return 'A'df['test_level'] = df.apply(lambda row: changle_level(row['test_Chinese'], row['test_Math'], row['test_English']), axis=1)return dfdef return_dtypes(self):# 从SqlObj().handle_df()返回df 并命名为datadata = SqlObj().handle_df()# 取第一行的值list_data = data.iloc[0,0:]# 因为是Series 所以我们可以取出index和values# 这个是灵活运用的 实际情况看实际情况而定index_ = list_data.index.tolist()values_ = list_data.values.tolist()# 因为函数to_sql,dtype参数是需要字典类型,所以我们创建好dict_,并进行写入dict_ = {}for i in range(len(index_)):if type(values_[i]) == str:dict_[index_[i]] = types.NVARCHAR(length=255)else:dict_[index_[i]] = types.Float()return dict_def concat_tables(self):# 调用SqlObj().handle_df()返回最终的dfdata = SqlObj().handle_df()print('最终数据:\n', data)print('-------------------------------------')# 返回提前设置好的字典类型dict1 = SqlObj().return_dtypes()print('最终需要上传到数据库的数据类型指定:\n', dict1)conn = create_engine('mssql+pymssql://服务器名/数据库名')# cursor = conn.cursor()data.to_sql(name='test_object', if_exists='append', schema='dbo', con=conn, index=False, dtype=dict1)# 关闭数据库conn.dispose()if __name__ == '__main__':cc = SqlObj()cc.return_dtypes()

啰嗦几句 if_exists有三个值分别是’fail’,'append’还有一个忘了

python自动创建sqlserver表并上传dataframe到创建的表中相关推荐

  1. mysql备份一个表到ftp_备份部分mysql表并上传至指定ftp服务器目录中

    防伪码:忘情公子著 前几天领导安排了一个任务,让写一个脚本备份某mysql数据库中的部分表,并要将备份好的文件上传至某ftp服务器中,于是就有了以下的脚本 #!/bin/bash #Filename: ...

  2. mysql数据库上传ftp服务器中_备份部分mysql表并上传至指定ftp服务器目录中

    防伪码:忘情公子著 前几天领导安排了一个任务,让写一个脚本备份某mysql数据库中的部分表,并要将备份好的文件上传至某ftp服务器中,于是就有了以下的脚本 #!/bin/bash #Filename: ...

  3. MySQL自动备份脚本和ftp上传脚本

    MySQL自动备份脚本,并上传ftp 在日常的工作中Mysql数据库备份是长期需要去做的一件运维工作,但是人工手动去做这一机械的动作确实必要性不高,所以写个脚本来跑是比较好的. mysql备份脚本 # ...

  4. php处理表单上传文件

    使用表单上传文件的时候,表单的提交方式必须是post提交方式,上传文件的input控件type属性值应为file,最重要的是form标签需要加一个enctype="multipart/for ...

  5. 从表单中提交图片到mysql_如何在Python框架Flas中将图像文件从表单上传到数据库...

    我正在尝试从一个表单上传一个图片到我正在工作的一个实践电子商务网站的Flask数据库中.我使用flask上传来处理文件上传,因为它看起来比其他上传文件的方式容易.我收到以下错误"NameEr ...

  6. python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)

    python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv) 一.上传文件 上传一个图片 使用input type="file& ...

  7. php文件上传并保存路径到数据库,thinkphp表单上传文件并将文件路径保存到数据库中?...

    上传单个文件,此文以上传图片为例,上传效果如图所示 创建数据库upload_img,用于保存上传路径 CREATE TABLE `seminar_upload_img` (  `id` int(11) ...

  8. js实现多图上传和预览(包含表单上传、ajax上传)

    请在这里查看示例 ☞ h5Upload示例 包含的知识点有:(仅考虑手机端,pc兼容性不清,建议使用jquery版本的) 1.浏览器自带的表单上传(页面会跳转) 2.ajax上传(异步刷新.自动上传. ...

  9. python实现阿里云OSS文件上传下载

    一 前言 最近使用到阿里云的产品OSS,用于临时存储线上抽取的数据,然后起本地化的流程去OSS拉回本地,进行自动化数据验证.OSS提供了web方式的管理控制台,命令行管理工具,提供了主流的SDK支持, ...

最新文章

  1. 国家的重视让少儿编程越来越火爆!
  2. [转】:VS 2010 : 如何开发和部署Outlook 2010插件(Add-in)
  3. nginx php fpm sock_nginx使用sock方式调用php-fpm
  4. RStudio-Desktop与RStudio-Server的启动方式
  5. Data Guard跳归档恢复的案例
  6. 什么是RAID(独立磁盘冗余阵列)?
  7. java实现c语言的函数_C语言tolower函数介绍、示例和实现
  8. azure云数据库_配置Azure SQL数据库防火墙
  9. Cocos2d-x学习:vs2010使用vld检测内存泄露
  10. GCC与交叉编译器(概念)
  11. 在Android Studio 中使用Assets资源文件
  12. MATLAB与信号处理课程手册
  13. python为什么是蛇的天敌_青蛙和蛇一直是天敌,只知道蛇会吃青蛙,你知不知道青蛙也吃蛇...
  14. 计算机主机拆机事项,一体机联想s700拆机流程与注意事项
  15. win gvim erlang 环境配置
  16. ajax打开新窗口被浏览器拦截的解决办法
  17. 全局安装vue-cli以及初始化
  18. 什么是抖音小店飞鸽3分钟人工回复率?了解客服回复问题以及解决方案
  19. SQL WEEK()函数
  20. JAVA 环境配置JDK

热门文章

  1. python做动态课件素材_万万没想到,还能这么玩!用 Python 生成动态 PPT
  2. DJ创作舞曲软件介绍
  3. Hadoop大数据开发基础
  4. 城域网BRAS之PPPOE
  5. Linux使用光盘镜像配置本地yum源(免于重复挂载)
  6. C语言常见困惑、错误集锦(上) ——《C陷阱与缺陷》3篇
  7. css边框的各种设定
  8. 怎么进行SWOT分析法?
  9. a律13折线pcm编码例题_13折线典型例题 -
  10. 十一、区块链学习-Hyperledger Fabric (基于release-1.0) 链码开发-marbles管理