python3 dbfpy3生成从数据库查询数据并导出dbf格式

 

 

from dbfpy3 import dbf
import pyodbc
import datetime
import decimal

# 数据库连接信息
server = '123.112.222.104'
database = 'zrkjdsszhyl'
username = 'zr'
password = 'zr'
driver = '{ODBC Driver 17 for SQL Server}'
port = '1433'

    
def get_dbf_field_type(sql_type):
    if sql_type in (str, 'varchar', 'nvarchar', 'char', 'nchar', 'text', b'varchar', b'nvarchar', b'char', b'nchar', b'text'):
        return 'C'
    elif sql_type in (int, 'int', 'smallint', 'tinyint', 'bigint', b'int', b'smallint', b'tinyint', b'bigint', b'number'):
        return 'N'
    elif sql_type in (float, decimal.Decimal, 'float', 'real', 'decimal', 'numeric', b'float', b'real', b'decimal', b'numeric'):
        return 'F'
    elif sql_type in (datetime.datetime, 'date', 'datetime', 'smalldatetime', 'datetime2', b'date', b'datetime', b'smalldatetime', b'datetime2'):
        return 'D'
    else:
        return 'C'
    
def get_dbf_field_length(length):
    return length if length <= 50 else 50


def get_dbf_field_length2(length):
    return length if length <= 254 else 254
    

# 连接数据库
connection = pyodbc.connect('DRIVER='+driver+';PORT='+port+';SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+password)


# 创建游标
# 执行查询并获取结果
cursor = connection.cursor()
sql = "select USERNAME,YLFKFS,JKKH,ZYCS,BAH,XM,XB,CSRQ,NL,GJ,BZYZSNL,XSECSTZ,XSERYTZ,CSD,GG,MZ,SFZH,ZY,HY,XZZ,DH,YB1,HKDZ,YB2,GZDWJDZ,DWDH,YB3,LXRXM,GX,DZ,DH2,RYTJ,RYSJ,RYSJS,RYKB,RYBF,ZKKB,CYSJ,CYSJS,CYKB,CYBF,SJZYTS,MZZD,JBBM,ZYZD,JBDM,RYBQ,QTZD1,QTZD2,QTZD3,QTZD4,QTZD5,QTZD6,QTZD7,QTZD8,QTZD9,QTZD10,QTZD11,QTZD12,QTZD13,QTZD14,QTZD15,JBDM1,JBDM2,JBDM3,JBDM4,JBDM5,JBDM6,JBDM7,JBDM8,JBDM9,JBDM10,JBDM11,JBDM12,JBDM13,JBDM14,JBDM15,RYBQ1,RYBQ2,RYBQ3,RYBQ4,RYBQ5,RYBQ6,RYBQ7,RYBQ8,RYBQ9,RYBQ10,RYBQ11,RYBQ12,RYBQ13,RYBQ14,RYBQ15,WBYY,H23,BLZD,JBMM,BLH,YWGM,GMYW,SWHZSJ,XX,RH,KZR,ZRYS,ZZYS,ZYYS,ZRHS,JXYS,SXYS,BMY,BAZL,ZKYS,ZKHS,ZKRQ,SSJCZBM1,SSJCZBM2,SSJCZBM3,SSJCZBM4,SSJCZBM5,SSJCZBM6,SSJCZBM7,SSJCZRQ1,SSJCZRQ2,SSJCZRQ3,SSJCZRQ4,SSJCZRQ5,SSJCZRQ6,SSJCZRQ7,SSJB1,SSJB2,SSJB3,SSJB4,SSJB5,SSJB6,SSJB7,SSJCZMC1,SSJCZMC2,SSJCZMC3,SSJCZMC4,SSJCZMC5,SSJCZMC6,SSJCZMC7,SZ1,SZ2,SZ3,SZ4,SZ5,SZ6,SZ7,YZ1,YZ2,YZ3,YZ4,YZ5,YZ6,YZ7,EZ1,EZ2,EZ3,EZ4,EZ5,EZ6,EZ7,QKDJ1,QKDJ2,QKDJ3,QKDJ4,QKDJ5,QKDJ6,QKDJ7,QKYHLB1,QKYHLB2,QKYHLB3,QKYHLB4,QKYHLB5,QKYHLB6,QKYHLB7,MZFS1,MZFS2,MZFS3,MZFS4,MZFS5,MZFS6,MZFS7,MZYS1,MZYS2,MZYS3,MZYS4,MZYS5,MZYS6,MZYS7,LYFS,YZZY_YLJG,WSY_YLJG,SFZZYJH,MD,RYQ_T,RYQ_XS,RYQ_F,RYH_T,RYH_XS,RYH_F,ZFY,ZFJE,YLFUF,ZLCZF,HLF,QTFY,BLZDF,SYSZDF,YXXZDF,LCZDXMF,FSSZLXMF,WLZLF,SSZLF,MAF,SSF,KFF,ZYZLF,XYF,KJYWF,ZCYF,ZCYF1,XF,BDBLZPF,QDBLZPF,NXYZLZPF,XBYZLZPF,HCYYCLF,YYCLF,YCXYYCLF,QTF from v_erm_upper_n41"
cursor.execute(sql)
results = cursor.fetchall()


# 创建DBF文件的字段属性
fields = [
    (field_name[0], get_dbf_field_type(field_name[1]), get_dbf_field_length(field_name[3]), get_dbf_field_length2(field_name[4]))
    for field_name in cursor.description
]

# 提取所有字段名到一个列表
field_names = [field[0] for field in fields]

with dbf.Dbf("example.dbf", new=True) as example_dbf:

    for field in fields:
        example_dbf.add_field((field[1], field[0], field[2], field[3]))

    for row in results:
        record = dbf.DbfRecord(example_dbf.header)
        
        for i in range(len(row)):
            # 获取字段名和字段值
            field_name = field_names[i]
            value = [tup[1] for tup in fields if tup[0] == field_name][0]
            # record[bytes(field_name, 'gbk')] = ''
            if value == 'F': 
                if row[i] is None or row[i] == '':
                    record[bytes(field_name, 'gbk')] = 0
                else :
                    record[bytes(field_name, 'gbk')] = row[i]
            elif value == 'D':
                if row[i] is None or row[i] == '':
                    date = datetime.date(11, 1, 1)
                    record[bytes(field_name, 'gbk')] = date
                else :
                    record[bytes(field_name, 'gbk')] = row[i]
            elif value == 'N':
                if row[i] is None or row[i] == '':
                    record[bytes(field_name, 'gbk')] = 0
                else :
                    record[bytes(field_name, 'gbk')] = row[i]
            else :
                # record[field_name] = '0'
                if row[i] is None or row[i] == '':
                    record[bytes(field_name, 'gbk')] = '0'
                else :
                    record[bytes(field_name, 'gbk')] = row[i].encode("gbk", errors="ignore").decode("gbk") #.encode('unicode_escape').decode('utf-8')
        example_dbf.append(record)


# 关闭数据库连接
cursor.close()
connection.close()

 

posted on 2023-03-29 12:02  王飞侠  阅读(673)  评论(0编辑  收藏  举报

导航