用pymssql 实现 python 连接 sql server,local host连接失败问题,及常见的前置数据处理操作

建立连接

    import pymssql
    
    connect = pymssql.connect('(local)', '', '', 'db_name')
    if connect:
        print("successfully connect to db")
    else:
        print("fail to connect to db")
    cursor = connect.cursor(as_dict=True)

as_dict=True 存放到字典中,不然select取回的数没有列名查询

cursor.execute("select * from dbo.table_name")

cursor.fetchone()

cursor.fetchmany()

cursor.fetchall()

local host 本地连接失败问题:进入sql server 配置 enable TCP/IP

也可以直接用pandas连接

data = pd.read_sql("select * from dbo.table_name", connect)

数据插入

INSERT INTO dbo.table_name (col1_name, col2_name, col3_name) VALUES ("1", "a", "1.5")

格式化插入

sql_string  = "SELECT INTO dbo.table_name (col1_name, col2_name, col3_name) VALUES ("%d", "'%s'", "%f")"

record = [1, "a", 1.5]
sql = sql_string % tuple(tuple)
cursor.execute(sql)

格式化的内容参考 https://www.cnblogs.com/fat39/p/7159881.html

pandas的数据插入sql server

def insert_into_db(df, item_type_dict, db_table_name):
    item_names = list(item_type_dict.keys())
    item_types = list(item_type_dict.values())
    df_for_sql_pre = df[item_names]
    df_for_sql = change_quotation_in_string(df_for_sql_pre, [col for col in item_names if col in CONTAIN_QUOTATION_COLS])
    sql_string = "INSERT INTO " + db_table_name + "(" + ",".join(item_names) + ") VALUES (" + ",".join(item_types) + ")"

    for record in df_for_sql.values.tolist():
        try:
            sql = sql_string % tuple(record)
            sql = sql.replace("nan", "NULL")
            cursor.execute(sql)
        except Exception as e:
            print(sql_string % tuple(record))
            print(e)
    connect.commit()

type_people=OrderedDict({"department": "'%s'",
                              "year_month":"'%s'",
                              "total_fd": "%d",
                              "total_fi": "%d",
                              "last_update_time": "'%s'",
                              "stat_dt": "'%s'"
                              })

insert_into_db(people_df, type_people, db_table_name)

数据清空

cursor.execute("delete from dbo.table_name")

常见插入问题:

1. int,decimal格式的字段如果数据里有空值,格式化后会变成"nan",无法插入到数据库中,可以在对格式化后的sql语句做replace,

sql = sql.replace("nan", "NULL")

2. 字符中出现单引号

如果要插入的字符串中有单引号,例如“Plant's people”

生成的sql 语句 VALUES(1,'Plant's people'),在插入时就会报错,需要转义

def change_quotation_in_string(df1, cols):
    df = df1.copy()
    for col in cols:
        if col in df.columns:
            df.loc[:, col] = df[col].apply(lambda x: x.replace("'","''"))
    return df

3.sql server数据库datetime和date类型

from datetime import datetime

datetime(2019,6,14) 用'%s'格式化后插入到datetime类型的字段

datetime(2019,6,14) .date() 用'%s'格式化后插入到date类型的字段

4. date字段的缺失值

sql = sql.replace("'NaT'", "NULL")

最后记得connect.close()关掉连接

 

其他

https://www.cnblogs.com/baiyangcao/p/pymssql_basic.html

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值