首先我们定义了一个数据库模型:
92 def get_fake_server(sf_id, vm_id,
address='100.1.1.25', parent_id=None):
93
server = {'sf_id': sf_id,
94
'name': 'server1',
95
'type': 'HOST',
96
'address': address,
97
98
'port': '8080',
99
'weight': 2,
100
'status': 'INSERVICE',
101
'parent_id': parent_id,
102
'deployed': 'True',
103
'vm_id': vm_id,
104
'extra': {'minCon':
300000,
105
'maxCon': 400000,
106
'rateBandwidth': 12,
107
'rateConnection': 1000}}
108
return server
602
values = get_fake_server('1',
1)
603
server1 =
db_api.server_create(self.conf, values)
604
server2 =
db_api.server_create(self.conf, values)
class models.Server:
185 __tablename__ =
'server'
186 id =
Column(String(32), primary_key=True, default=create_uuid)
187 sf_id =
Column(String(32), ForeignKey('serverfarm.id'))
188 name =
Column(String(255))
189 type =
Column(String(255))
190 address =
Column(String(255))
191 port =
Column(String(255))
192 weight =
Column(Integer)
193 status =
Column(String(255))
194 parent_id =
Column(Integer)
195 deployed =
Column(String(40))
196 vm_id =
Column(String(255))
197 extra =
Column(JsonBlob())
198
199 serverfarm =
relationship(ServerFarm,
200
backref=backref('servers', order_by=id),
201
uselist=False)
定义一个获取该数据模型对应的字典函数:
再定义一个存数据库的函数:
457 def server_create(conf, values):
458 session =
get_session(conf)
459 with
session.begin():
460
server_ref = models.Server()
461
server_ref.update(values)
462
session.add(server_ref)
463
print
'-------',dict(session.query.first().iteritems())
464
return server_ref
下面我们用下面的指令来执行一下:
输出如下:
------- {'status':
'INSERVICE', 'name': 'server1', 'weight': 2, 'extra': {'maxCon':
400000, 'rateConnection': 1000, 'rateBandwidth': 12, 'minCon':
300000}, 'vm_id': 1, 'sf_id': '1', 'id':
'4d8c564830ae426782b67ef0 b54d5335', 'parent_id': None, 'address':
'100.1.1.25', 'type': 'HOST', 'port': '8080', 'deployed':
'True'}
------- {'status':
u'INSERVICE', 'name': u'server1', 'weight': 2, 'extra': {u'maxCon':
400000, u'rateBandwidth': 12, u'rateConnection': 1000, u'minCon':
300000}, 'vm_id': u'1', 'sf_id': u'1', 'id':
u'4d8c564830ae426782b67ef0 b54d5335', 'parent_id': None, 'address':
u'100.1.1.25', 'type': u'HOST', 'port': u'8080', 'deployed':
u'True'}
神奇的事情发生了,values的字符串编码为ascii,第一次存入values,并读出的编码也为ascii。第二次存入values,读出时,就出现了诡异的事情。读出的所有str型的value值全都变成unitcode。
原因在于,我们获取values =
get_fake_server('1',
1)时,将vm_id=1。而在数据库中,它存放的类型是string型。所以就导致出现了这种诡异的现象。