簡體   English   中英

Python with sqlalchemy db retrival

[英]Python with sqlalchemy db retrival

我是python和sqlalchemy的新手。我編寫了以下netowrk程序。

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

    #----------------------------------------------------------------------
    def __init__(self, src_address,port_no):
        """"""
        self.src_address = src_address
        self.port_no     = port_no
if session.query(SourcetoPort).filter_by(src_address='packet.dst').all():

在上面的代碼行

 if session.query(SourcetoPort).filter_by(src_address='packet.dst').all(): 

沒有按照我的預期工作。我期望它應該從sqlalchemy數據庫中檢索條目,如果成功(因為輸出不是NONE),它應該執行以下代碼。

當我嘗試使用print打印該行時

session query  []

我得到的輸出是

 session query [] 

我做錯了什么。如果有人能指出這一點,那就太好了。

如果我根據建議更改上述行

creating a new db entry
RECIEVED FROM PORT  2 SOURCE  96:74:ba:a9:92:b9
creating a new db entry

ERROR:core:Exception while handling Connection!PacketIn...
Traceback (most recent call last):
  File "ws_thesis/pox/pox/lib/revent/revent.py", line 234, in raiseEventNoErrors
    return self.raiseEvent(event, *args, **kw)
  File "ws_thesis/pox/pox/lib/revent/revent.py", line 281, in raiseEvent
    rv = event._invoke(handler, *args, **kw)
  File "ws_thesis/pox/pox/lib/revent/revent.py", line 159, in _invoke
    return handler(self, *args, **kw)
  File "ws_thesis/pox/tutorial.py", line 137, in _handle_PacketIn
    self.act_like_switch(packet, packet_in)
  File "ws_thesis/pox/tutorial.py", line 101, in act_like_switch
    print session.query(SourcetoPort).filter_by(src_address=packet.dst).count()
  File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2400, in count
    return self.from_self(col).scalar()
  File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2045, in scalar
    ret = self.one()
  File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2014, in one
    ret = list(self)
  File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2057, in __iter__
    return self._execute_and_instances(context)
  File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2072, in _execute_and_instances
    result = conn.execute(querycontext.statement, self._params)
  File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1405, in execute

我收到以下錯誤:

 creating a new db entry RECIEVED FROM PORT 2 SOURCE 96:74:ba:a9:92:b9 creating a new db entry ERROR:core:Exception while handling Connection!PacketIn... Traceback (most recent call last): File "ws_thesis/pox/pox/lib/revent/revent.py", line 234, in raiseEventNoErrors return self.raiseEvent(event, *args, **kw) File "ws_thesis/pox/pox/lib/revent/revent.py", line 281, in raiseEvent rv = event._invoke(handler, *args, **kw) File "ws_thesis/pox/pox/lib/revent/revent.py", line 159, in _invoke return handler(self, *args, **kw) File "ws_thesis/pox/tutorial.py", line 137, in _handle_PacketIn self.act_like_switch(packet, packet_in) File "ws_thesis/pox/tutorial.py", line 101, in act_like_switch print session.query(SourcetoPort).filter_by(src_address=packet.dst).count() File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2400, in count return self.from_self(col).scalar() File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2045, in scalar ret = self.one() File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2014, in one ret = list(self) File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2057, in __iter__ return self._execute_and_instances(context) File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2072, in _execute_and_instances result = conn.execute(querycontext.statement, self._params) File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1405, in execute 

如果要按變量內容過濾項目,則需要直接使用該變量:

session.query(SourcetoPort).filter_by(src_address=packet.dst)

您試圖通過字符串'packet.dst'進行過濾。

您在創建 SourcetoPort條目時犯了同樣的錯誤; 你可能想存儲packet.src表達式的結果,而不是字符串'packet.src'

SourcetoPort(src_address=packet.src, port_no=packet_in.in_port)

請注意,調用.all()從數據庫中檢索所有匹配的條目,但您只在if測試中使用它。 這將是更有效的(可能更加如此)使用.count()代替.all()讓數據庫告訴我們很多項目如何匹配:

if session.query(SourcetoPort).filter_by(src_address=packet.dst).count():

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM