首先我们定义了一个数据库模型:
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型。所以就导致出现了这种诡异的现象。