python sqlite数据库的诡异事件

首先我们定义了一个数据库模型:
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)

定义一个获取该数据模型对应的字典函数:
  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

再定义一个存数据库的函数:
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


下面我们用下面的指令来执行一下:
 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)

输出如下:
------- {'status': 'INSERVICE', 'name': 'server1', 'weight': 2, 'extra': {'maxCon': 400000, 'rateConnection': 1000, 'rateBandwidth': 12, 'minCon': 300000}, 'vm_id': 1, 'sf_id': '1', 'id': '4d8c564830ae426782b67ef0b54d5335', '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'4d8c564830ae426782b67ef0b54d5335', '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型。所以就导致出现了这种诡异的现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值