csv文件导入数据库问题

        准备将csv导入数据库,本人对Oracle数据库基本操作还算熟悉,所以使用load data很快就搞定。但是在python连接数据库并调用load data命令导入Oracle数据库时,确碰到cx-oracle库不匹配的问题,找了很久没找到匹配版本,只能转而将csv导入mysql数据库。

1、cx-oracle与我的平台不兼容

       win7 64位操作系统,python3.6 32bits,oracle 10g数据库及客户端

       该环境下没有找到合适cx-oracle版本。

2、mysql数据库,也提供了load data,和oracle稍有差异。

      建议看 mysql doc官方链接:https://dev.mysql.com/doc/refman/5.7/en/load-data.html

      英文看不明白的也可看:https://blog.csdn.net/duckyamd/article/details/53143639

                                                 https://blog.csdn.net/oTengYue/article/details/53290710

 3、csv入库代码记录

代码主要是展示自己的思路,不能直接使用:

from settings import Settings
import pymysql
import os

class Dbcon():
    def __init__(self):
        self.cur = ''
        self.con = ''

    def connectdb(self,Settings):
        self.con = pymysql.connect(user=Settings.mysqluser,
                              passwd=Settings.mysqlpaw,
                              db=Settings.mysqldb,
                              host=Settings.mysqlhost,
                              charset ="utf8",
                              autocommit = 1,
                              local_infile=True)
        self.cur = self.con.cursor()

    def create_table(self,table_name):
        sql = 'CREATE TABLE ' + table_name +'(TIME VARCHAR(10) NOT NULL,^^^^^^);'
        self.cur.execute(sql)
        # 创建唯一性约束
        sql = 'alter table ' + table_name + ' add constraint uk_t_1 unique (time,icao24);'
        self.cur.execute(sql)
        self.con.commit()


    def csv_to_db(self,file_path,table_name):
        data = "LOAD DATA local INFILE '%s' replace INTO TABLE %s FIELDS TERMINATED BY ',' escaped by '' IGNORE 1 LINES;"% (file_path,table_name)

        self.cur.execute(data)
        self.con.commit()

    def endlink(self):
        self.cur.close()
        self.con.close()


# 使用,s_3表名
# db = Dbcon()
# set = Settings()
# db.connectdb(set)
# db.create_table('states_6')
# db.csv_to_db('./datadownload/states_00.csv','states_6')
#
# db.endlink()

        代码思路如上,部分敏感处已删除

       (1)  load data时主要跳过NULL数值时,使用的是escape by '',和oracle不同。同时要想escape可以使用,还需配置my.ini文件,修改

# Set the SQL mode to strict
# sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

       (2)对于NULL值,当数据类型为float时,默认会填0(不符合要求),因为Mysql认为空值置为0有利于节省空间,所以在导入数值型字段时,默认将空值置为0。 而varchar类型则为空值(符合项目要求)。

         但数值置为0则无法体现出其本身的物理意义。该问题未解决,如果有研究的,可留言!!!!

       

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值