背景
实际运用过程中需要把数据库A中的数据转移到数据库B(均为SQL server数据库),本例使用Python来实现。文中两个.py文件中涉及的数据库连接信息以及SQL语句均以自己的实际需求为准。
实现
代码块1(把数据从数据库A中拿出来)import pymssql #数据库服务器信息 server="数据库A服务器" user="账号" password="密码" database="数据库" conn=pymssql.connect(server,user,password,database) cur = conn.cursor() sql = """select * from table""" cur.execute(sql) rows_SCCM = cur.fetchall() cur.close() conn.close()
12345678910111213141516 代码块2(把代码块1中的查询的数据存入代码2中)注:
插入新数据中时,SQL语句要明确指出列名,否则可能会出现莫名的错误。本例中这个语句最好是在VALUES后指明列名。 INSERT INTO [SCCM].[dbo].[SCCM_FOR_ASSETS] VALUES(指明列名) ('%s','%s','%s','%s','%s','%s','%s','%s')""" % (var1,var2,var3,var4,var5,var6,var7,var8)None替换为NULL值似乎不必要,可直接将None插入数据库,后续直接替换None为空值即可。此思路不确定完全正确。if var1 == None: var1 = 'NULL'
import pymssql from SQLserver_Assets import rows_SCCM #引入代码块1中抓取出来的数据 from datetime import datetime,timedelta import time #数据库服务器信息 server="数据库B服务器" user="账号(此处的账号应有足够的权限,因为此处涉及到删除数据以及插入数据)" password="密码" database="数据库" conn=pymssql.connect(server,user,password,database) #获取系统时间,用以记录程序运行的日期信息 date = datetime.today() + timedelta() date1 = date.strftime("%Y%m%d") #删除旧数据并插入新数据 cur = conn.cursor() sql1 = """delete from [SCCM].[dbo].[SCCM_FOR_ASSETS]""" cur.execute(sql1) #删除旧数据 conn.commit() i = 0 while (i<len(rows_SCCM[i])): var1 = rows_SCCM[i][0] if var1 == None: var1 = 'NULL' #此判断均用于解决python中的None在SQL中无法保存的问题,SQL中空值为NULL。注意此处的NULL实际为字符串,并不是真正的空值。后续会有代码部分对此部分进行处理。 var2 = rows_SCCM[i][1] if var2 == None: var2 = 'NULL' var3 = rows_SCCM[i][2] if var3 == None: var3 = 'NULL' var4 = rows_SCCM[i][3] if var4 == None: var4 = 'NULL' var5 = rows_SCCM[i][4] if var5 == None: var5 = 'NULL' var6 = rows_SCCM[i][5] if var6 == None: var6 = 'NULL' var7 = rows_SCCM[i][6] if var7 == None: var7 = 'NULL' var8 = date1 sql = """INSERT INTO [SCCM].[dbo].[SCCM_FOR_ASSETS] VALUES ('%s','%s','%s','%s','%s','%s','%s','%s')""" % (var1,var2,var3,var4,var5,var6,var7,var8) try: cur.execute(sql) #插入新数据 conn.commit() print(i) except: pass #对插入失败的行进行二次插入,减少插入失败的部分。 i += 1 sql2 = """UPDATE [SCCM].[dbo].[SCCM_FOR_ASSETS] SET [USERNAME] = NULL WHERE [USERNAME] = 'NULL'""" cur.execute(sql2) #此处为把SQL中NULL字符串UPDATE为真正的空值。 conn.commit() cur.close() conn.close()
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162个人能力有限,如有谬误欢迎指正!