上一篇我们实现了英雄的自动生成与手动创建,接下来我们就应该将生成的英雄属性存入到我们的mysql数据库中。
首先我们在配置文件conf.cfg中写入mysql信息
# MysqlDB配置文件
[MYSQL_DB]
host =127.0.0.1
port =3306
user =username
passwd =password
charset =utf8
按照各自的mysql地址、端口、用户名和密码进行修改,之后我们打开GetConn中的get_conn()方法进行数据库连接。
defget_conn(db):
"""
获取配置文件的内容来创建数据库连接
@ cp 读取配置文件
@ host 数据库地址
@ port 数据库端口
@ user 数据库用户名
@ passwd 数据库密码
@ charset 数据库编码
@ conn 创建数据库连接
:paramdb: 需要连接的数据库名称
:return: conn 数据库连接
"""
# 分别从配置文件中读入mysql配置信息
cp = configparser.ConfigParser()
cp.read('./conf.cfg',encoding='utf-8')
host = cp.get('MYSQL_DB','host')
port =int(cp.get('MYSQL_DB','port'))
user = cp.get('MYSQL_DB','user')
passwd = cp.get('MYSQL_DB','passwd')
charset = cp.get('MYSQL_DB','charset')
# 异常控制
try:
# 创建数据库连接
conn = pymysql.connect(
host=host,
port=port,
user=user,
passwd=passwd,
db=db,
charset=charset
)
# 返回数据库连接对象
returnconn
exceptExceptionase:
print(e)
我们从配置文件conf.cfg中读入mysql的配置信息,然后使用pymysql(python2中使用MySQL-python)来创建数据库连接,并定义conn来接收创建的数据库连接对象并返回,因为后面的所有数据库操作都将使用这个conn来完成。
接下来我们在mysql数据库中使用'create database hero_era_2;'命令创建一个数据库,这个数据库名将作为我们创建数据库连接时传入的参数db。
# 调用GetConn中的get_conn()方法获取一个数据库连接对象
self.conn = Conn.get_conn('hero_era_2')
然后我们需要创建heroes表,用于存储所有英雄信息
defcreate_hero_table(conn):
"""
重建英雄数据表
用于新游戏时,清空上一场游戏数据内容,重新生成英雄数据表
:paramconn: 数据库连接对象
:return: None
"""
# 获取数据库操作游标
cursor = conn.cursor()
# SQL删除英雄表
drop_sql ='DROP TABLE IF EXISTS heroes;'
# SQL创建英雄表
create_sql ='''
CREATE TABLE heroes (
h_idINT(10) NOT NULL AUTO_INCREMENT COMMENT '英雄ID',
h_groupINT(10) DEFAULT 0 COMMENT '所属势力ID',
h_nameVARCHAR(10) COLLATE utf8_bin DEFAULT NULL COMMENT '英雄姓名',
h_genderVARCHAR(10) COLLATE utf8_bin DEFAULT NULL COMMENT '英雄性别',
h_ageINT(10) DEFAULT NULL COMMENT '英雄年龄',
h_identityVARCHAR(10) COLLATE utf8_bin DEFAULT NULL COMMENT '英雄身份',
h_leadINT(10) DEFAULT NULL COMMENT '英雄统率',
h_forceINT(10) DEFAULT NULL COMMENT '英雄武力',
h_brainINT(10) DEFAULT NULL COMMENT '英雄智力',
h_politicsINT(10) DEFAULT NULL COMMENT '英雄政治',
h_charmINT(10) DEFAULT NULL COMMENT '英雄魅力',
h_statusINT(10) DEFAULT 1 COMMENT '英雄状态',
PRIMARY KEY (h_id),
KEY (h_group)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
'''
try:
# 执行SQL
cursor.execute(drop_sql)
cursor.execute(create_sql)
exceptExceptionase:
print(e)
# 事务回滚
conn.rollback()
这里使用到了SQL语句创建表,并设定h_id作为主键,序列自增;设定英雄势力h_group默认值为0,即未加入任何势力;设定英雄状态h_status默认值为1,即在野状态;设定外键为h_group;设定编码为utf-8。
另外使用了事务回滚rollback()函数,其作用是在数据库执行操作出错时保证数据库不做更改,这样能很好地保护数据库中的数据不会受到错误操作的影响。
最后我们还需要实现将数据插入到数据库表,同样在GetConn中找到insert_data()方法
definsert_data(data,t_name,conn):
"""
向数据库中插入数据
@ conn 接收由get_conn()返回的conn这个数据库连接
@ cursor 数据库操作游标,用于数据库操作
@ keys 拼接SQL语句,值是student字典中所有的key
@ values 拼接SQL语句,值是student字典中所有的value
@ sql 拼接需要执行的SQL语句
:paramdata: 插入数据字典
:paramt_name: 操作表名称
:paramconn: 数据库连接对象
:return: None
"""
keys =''
values =''
cursor = conn.cursor()
# 遍历字典中所有的key和value并分别接收拼接
forkey,valueindata.items():
keys = keys +'{},'.format(key)
values = values +'"{}",'.format(value)
sql ='INSERT INTO () VALUES()'.format(
t_name,keys[:-1],values[:-1]
)
# 异常控制
try:
# 执行SQL语句并提交事务
cursor.execute(sql)
conn.commit()
exceptExceptionase:
print(e)
# 事务回滚
conn.rollback()
在这里我们定义了一个keys用来接收拼接数据库字段,values用来接收拼接数据的值,因为我们传过来的hero_data是一个字典,且字典的key和heroes表中的字段一一对应,所以我们以这样的方式减少了SQL语句的复杂度,且可以通用于整个程序的数据插入操作。
该方法需要传入一个t_name参数,作为连接的数据库中需要操作的数据表名,并使用了commit()函数进行事务提交。这里需要注意的是,如果我们不使用整个commit()函数,则数据不会被写入数据表中。
到这里我们的数据库英雄部分的入库准备已经完成,那么接下来我们就回到Hero_Era去将这几个部分结合起来,实现英雄的自动创建与入库。
导入GetConn用于数据库操作并定义别名为Conn:
fromHero_Era_Pro2importGetConnasConn
创建数据库连接对象:
self.conn = Conn.get_conn('hero_era_2')
新建一个英雄表:
Conn.create_hero_table(self.conn)
导入Hero_Builder用于英雄创建并定义别名为HB:
fromHero_Era_Pro2importHero_BuilderasHB
调用auto_create_hero()方法自动创建英雄,并指定英雄数为10:
HB.auto_create_hero(self.conn,10)
让玩家可以选择自动创建英雄:
choice =int(input('1 新建英雄 2 选择势力\n'))
调用new_hero()方法新建一个英雄:
HB.new_hero(self.conn)
最后一步,分别在Hero_Builder中的auto_create_hero()和new_hero()中添加一个数据库插入操作,并传入生成的英雄属性。当然,我们需要在Hero_Builder中导入GetConn。
fromHero_Era_Pro2importGetConnasConn
Conn.insert_data(hero_data,'heroes',conn)
到这里我们就完成了英雄自创建到入库的所有操作,让我们验证一下:
没问题,那我们再去看看mysql数据库的heroes表中是否插入了这些数据。
我们可以看到数据库中也出现了所有的英雄数据信息,且h_group和h_status的值分别为我们设定的默认值0和1,另外生成的英雄数也是我们所指定的10人,他们的h_id则自动从1开始增长到了10。
至于我们新建的英雄林妹妹,则是在new_hero()中指定了其h_id为500,用以区别。
hero_data['h_id'] =500
本篇到此结束,下一篇将从以上数据中随机选出两人作为势力主公实现势力的创建。
感谢阅读,欢迎继续关注~