2013-05-09 72 views
0
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我得到同样的错误

+1

什么是你列 'src_address' 的大小更多的讨论?以及您尝试使用的数据的大小?这个警告告诉你DBMS必须切断数据才能将它们分别放入列中。也许改变列的长度? ;-) – medina 2013-05-10 00:10:29

+0

我已经更新了基于你的问题的问题。同样的问题。 – liv2hak 2013-05-10 01:05:16

+1

当您更改src_address的长度时,您是否只在程序中执行此操作?或者你是否也更改了底层表? – 2013-05-10 01:25:27

回答

3

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

还有一种更新列而不重新创建表的方法 - 通过使用ALTER TABLE查询。

alter table source_to_port modify src_address varchar(32); 

this SO answer

2

问题是,我改变了列的长度只有在program.I不得不做 或者更改数据库表中列的长度或删除表格(创建的新表格将具有程序中指定的正确长度。)

相关问题