[英]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.