2017-03-25 68 views
0

更新我有一個代碼(蟒蛇3.6,SQLAlchemy的1.1.6)的一個問題,這個工作得很好:錯誤與SQLAlchemy的

def delete_item(): 
    input_id = int(input('Select ID number of item to delete: ')) 

    delete = create_table().delete().where(create_table().c.id == input_id) 

    # Commit delete 
    connection.execute(delete) 

,但是這一個我有一個錯誤,但我真的穿上」知道爲什麼:

def update_item(): 
    input_id = int(input('Select ID number of item to change: ')) 

    # Get data from rows with selected ID number 
    select_data = select(['*']).where(
     create_table().c.id == input_id) 
    for row in connection.execute(select_data): 
     input_name = input('New name for name: {}: '.format(row[1])) 
     input_description = input(
      'New description for description: {}: '.format(row[6])) 
     input_exclusion = input(
      'New exclusions for exclusion: {}: '.format(row[7])) 
     # OperationalError 
     update_data = update(create_table()).where(create_table().c.id == input_id).values(
      name='{}'.format(input_name), 
      description='{}'.format(input_description), 
      exclusion='{}'.format(input_exclusion)) 

     # Commit change 
     connection.execute(update_data) 

回溯消息:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "FROM": 
syntax error [SQL: 'UPDATE clothes_data SET name=?, description=?, 
exclusion=? FROM clothes_data WHERE clothes_data.id = ?'] [parameters:  
('new name', 'new desc', 'new excl', 92)] 

CREATE_TABLE功能:

def create_table(): 
    metadata = MetaData() 

    # set name of table, names of columns, kind of data in columns 
    clothes_data = Table('clothes_data', metadata, 
         #columns 
    ) 

    # commit changes in data base 
    metadata.create_all(engine) 

    return clothes_data 
+1

應該已經發布的錯誤信息? –

+0

'create_table()'函數是什麼樣的?我懷疑它會在每次調用時創建表對象的新實例,從而導致'update()'產生不正確的查詢。 –

+0

@MarcinKoprek,更新您的問題主體而不是將您的代碼發佈爲評論 –

回答

1

問題的根源是在你創建表(S)的方式。由於您的create_table()創建每個調用它新的元數據和新的Table例如,SQLAlchemy的認爲它們不同的實體。一般而言,您應該爲每個程序創建一次表格定義。

所以在

表中的WHERE子句不更新表,所以你已經引發了multiple table update,這SQLite不支持的。此修復程序將取決於你如何設置你的程序的結構,但例如,您可以創建一個名爲model,在那裏您存儲Table S和聲明類模塊。一個快速的解決將是

def update_item(): 
    input_id = int(input('Select ID number of item to change: ')) 
    select_data = select(['*']).where(create_table().c.id == input_id) 
    for row in connection.execute(select_data): 
     input_name = input('New name for name: {}: '.format(row[1])) 
     input_description = input(
      'New description for description: {}: '.format(row[6])) 
     input_exclusion = input(
      'New exclusions for exclusion: {}: '.format(row[7])) 
     # CREATE ONCE 
     table = create_table() 
     update_data = update(table).where(table.c.id == input_id).values(
      name='{}'.format(input_name), 
      description='{}'.format(input_description), 
      exclusion='{}'.format(input_exclusion))  
     # Commits changes, IF autocommit is in use 
     connection.execute(update_data) 

但請動你的表和模型類的模塊。