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://[email protected]/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"
我有一个网络,其中我从一个主机发送分组到another.The预期的行为是第一次src_address,端口对应插入到SQL数据库,此后它应该只做检索操作。我已经测试了这个函数与本地数据库使用sqlite正常工作。然后我转移到远程数据库使用MySQL。警告:数据被截断为列“src_address”在行1
现在我发现
if r_res is None:
始终是真实的,这意味着
r_res = session.query(SourcetoPort).filter_by(src_address = STR(packet.src))。第()
总是失败。
我怀疑这与一些错误的查询/添加为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.Still我得到同样的错误
什么是你列 'src_address' 的大小更多的讨论?以及您尝试使用的数据的大小?这个警告告诉你DBMS必须切断数据才能将它们分别放入列中。也许改变列的长度? ;-) – medina 2013-05-10 00:10:29
我已经更新了基于你的问题的问题。同样的问题。 – liv2hak 2013-05-10 01:05:16
当您更改src_address的长度时,您是否只在程序中执行此操作?或者你是否也更改了底层表? – 2013-05-10 01:25:27