警告:第1行的列'src_address'的数据被截断

时间:2013-05-09 23:59:30

标签: python mysql sql sqlalchemy

from pox.core import core
import pox.openflow.libopenflow_01 as of
import re

import datetime
import time
from sqlalchemy import create_engine, ForeignKey
from sqlalchemy import Column, Date, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql.expression import exists
log = core.getLogger()

engine = create_engine('mysql://root@192.168.129.139/nwtopology', echo=False)
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()

class SourcetoPort(Base):
    """"""
    __tablename__ = 'source_to_port'
    id = Column(Integer, primary_key=True)
    port_no        = Column(Integer)
    src_address    = Column(String(16),index=True)

    #-----------------------------------------
    def __init__(self, src_address,port_no):
        """"""
        self.src_address = src_address
        self.port_no     = port_no

   #create tables
   Base.metadata.create_all(engine)

    def act_like_switch (self, packet, packet_in):


"""
Implement switch-like behavior.
"""
# Learn the port for the source MAC
#print "RECIEVED FROM PORT ",packet_in.in_port , "SOURCE ",packet.src ,"DEST" , packet.dst
self.mac_to_port[packet.src]=packet_in.in_port
r_res = session.query(SourcetoPort).filter_by(src_address=str(packet.src)).first()
if r_res is None:
    print "inserting an entry"
    start = time.time()
    entry = SourcetoPort(src_address=str(packet.src) , port_no=packet_in.in_port)
    #add the record to the session object
    session.add(entry)
    #add the record to the session object
    session.commit()
    end = time.time()
    elapsed = end - start
    print "elapsed insert time ",elapsed
else:
    print "entry already present"

我有一个网络,我将数据包从一个主机发送到另一个主机。预期的行为是第一次将src_address,端口对插入到sql数据库中,之后它应该只进行检索操作。我已经测试过这个functionlity使用sqlite正确地使用本地数据库。然后我使用mysql转移到远程数据库。

现在我找到了

if r_res is None:

总是如此,意思是

r_res = session.query(SourcetoPort).filter_by(src_address = str(packet.src))。first()

总是失败。

我怀疑这与mysql的一些错误查询/添加有关,这与sqlite不同。

It did print out a warning as below when inserting an entry.
/usr/lib/python2.7/dist-packages/sqlalchemy/engine/default.py:330: Warning: Data truncated for column 'src_address' at row 1
  cursor.execute(statement, parameters)

我无法弄清楚究竟是什么问题。

根据评论,我打印出了我想要插入的src_address的大小。

 print 'length of src addreess',len(str(packet.src))
 it prints 17

我已将src_address的大小增加到17,32和64.但是我得到同样的错误

2 个答案:

答案 0 :(得分:3)

以下方法可能会为您节省时间。

我们还有一种更新列的方法,无需重新创建表 - 使用ALTER TABLE查询。

alter table source_to_port modify src_address varchar(32);

this SO answer

中查看更多讨论

答案 1 :(得分:2)

问题是我只在程序中更改了列的长度。我必须这样做 或者更改数据库表中列的长度或删除表(创建的新表将具有在程序中指定的正确长度。)