1. 创建数据表(10张分表为例)
创建 10 张分表:eth_special_addr_trx_0, eth_special_addr_trx_1, ......, eth_special_addr_trx_9
# 创建 10 个Hash分表
for i in range(10):
sql_create_table = '''
create table eth_special_addr_trx_{}
(
tx_hash varchar(70) primary key not null
comment '交易hash值',
block varchar(15) null
comment '所在区块',
create_time varchar(25) null
comment '交易创建时间',
constraint ethereum_special_address_transactions_{}_tx_hash_uindex
unique (tx_hash)
)
comment 'ETH 交易表';
'''.format(i, i)
cursor.execute(sql_create_table)
mysql_conn.commit()
2.数据入库
根据 address 值唯一确定一个hashID, hashID即代表哪一个分表。
...
def hashID(address, max_num):
"""根据 address 确定唯一 hash 值(确定分表)"""
hash_str = hashlib.md5(address.encode(encoding='UTF-8')).hexdigest() # 16进制 -- 900150983cd24fb0d6963f7d28e17f72
num = int(hash_str[:2] + hash_str[-2:], 16) # 16进制 --> 10进制
print(hash_str, hash_str[:2], hash_str[-2:], num)
hashID = num % max_num # 8
print('HashID:', hashID)
return hashID
# 调用 hashID, 确定 分表id
table_id = hashID(address, 10)
# mysql操作,保存入库
insert_sql = '''insert into eth_special_addr_trx_{} (`tx_hash`,`block`,`create_time`) value(%s, %s, %s)'''.format(table_id)
data = (tx['tx_hash'], tx['block'], tx['create_time'])
cursor.execute(insert_sql, data)
mysql_conn.commit()
...
-------- END --------