2014-12-06 3 views
1

Я пытаюсь обновить строку в таблице, но у меня возникает ошибка аргумента.Почему я получаю выражение «FROM expression expected» из SQLAlchemy, когда я пытаюсь обновить строку в таблице?

Вот код:

inventory_host = InventoryHost(ipv4_addr=ipv4, ipv6_addr=ipv6, macaddr=mac, host_name=name) 

try: 
    session.add(inventory_host) 
    session.commit() 
except sqlalchemy.exc.IntegrityError: 
    session.execute(update(inventory_host)) 
    session.commit() 

session.close() 

Это ошибка, я получаю:

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "perception.py", line 77, in <module> 
    main() 
    File "perception.py", line 66, in main 
    modules.nmap_parser.parse_nmap_xml(nmap_xml) 
    File "/Users/arozar/Documents/Scripts_Code/Python-Projects/perception/modules/nmap_parser.py", line 128, in parse_nmap_xml 
    session.execute(update(inventory_host)) 
    File "<string>", line 2, in update 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/sqlalchemy/sql/dml.py", line 668, in __init__ 
    ValuesBase.__init__(self, table, values, prefixes) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/sqlalchemy/sql/dml.py", line 183, in __init__ 
    self.table = _interpret_as_from(table) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/sqlalchemy/sql/selectable.py", line 41, in _interpret_as_from 
    raise exc.ArgumentError("FROM expression expected") 
sqlalchemy.exc.ArgumentError: FROM expression expected 

В session.add(inventory_host) работает для новых хозяев в таблице inventory_host, но как только я пытаюсь обновить строку, используя session.execute(update(inventory_host)) Я получаю ошибку.

ответ

2

update принимает имя таблицы как своего первого аргумента, а не экземпляр вашего класса таблицы. Какое значение (ы) вы хотите обновить? Например, если вы хотите обновить имя хоста, вы можете сделать это:

from sqlalchemy import update 

# Ideally, just use your primary key(s) in your where clause; I'm not sure what they are 
stmt = (update(InventoryHost).where(ipv4_addr=ipv4, ipv6_addr=ipv6, macaddr=mac) 
     .values(host_name=name) # updates the host_name, for example 
session.execute(stmt) 
... 
+0

Спасибо, это помогло! Я начал работать так, как сейчас. –

+0

@ insecure-IT Отлично! Рад, что вы его работали. Приветствия. –

Смежные вопросы