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': '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型。所以就导致出现了这种诡异的现象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值