2017-04-27 24 views
0

我有一個字典列表中的數據,我試圖插入數據到我的數據庫然後我得到錯誤sqlalchemy.exc.CompileError:具有當前數據庫版本設置的「默認」方言不支持就地多行插入。當前數據庫版本設置的'默認'方言不支持就地多行插入

from sqlalchemy import create_engine,Table,Column,String,Integer,MetaData,ForeignKey 
from sqlalchemy_utils import database_exists,create_database,drop_database 
from sqlalchemy.orm import join 

engine = create_engine("mysql+mysqldb://root:[email protected]:3306/sqlalchemy") 
conn = engine.connect() 

if database_exists(engine.url): 
    drop_database(engine.url) 

create_database(engine.url) 

metaData = MetaData() 

userTable = Table("user", metaData 
    , Column("Id", Integer, primary_key = True) 
    , Column("Name", String(25))) 

orderTable = Table("order", metaData 
    , Column("Id", Integer, primary_key = True) 
    , Column("UserId", Integer, ForeignKey("user.Id")) 
    , Column("Desc", String(250))) 

try: 
    metaData.create_all(engine) 
except Exception as ex: 
    print(ex) 

users = [ 
    {"Id": 1, 
    "Name": "user1"}, 
    {"Id": 2, 
    "Name": "user2"}, 
    {"Id": 3, 
    "Name": "user3"}, 
    {"Id": 4, 
    "Name": "user4"} 
] 

orders = [ 
    {"Id": 1, 
    "UserId": 1, 
    "Desc": "desc1"}, 
    {"Id": 2, 
    "UserId": 1, 
    "Desc": "desc2"}, 
    {"Id": 3, 
    "UserId": 2, 
    "Desc": "desc3"}, 
    {"Id": 4, 
    "UserId": 2, 
    "Desc": "desc4"}, 
] 

sql = userTable.insert().values(users) 
print(sql) #this line causes the exception 

conn.execute(sql) 

sql = orderTable.insert().values(orders) 
print(sql) 

conn.execute(sql) 

sql = userTable.select() 
print(sql) 
returnUsers = conn.execute(sql) 
print(returnUsers) 

sql = orderTable.select() 
print(sql) 
returnOrders = conn.execute(sql) 
print(returnOrders) 

conn.close() 

更新:沒有打印(SQL),它可以完美的作品。

回答

2

試試看它是否可以工作,如果你迭代了一系列的字典並單獨傳入字典。你要做的是使用特殊的語法,這在所有的方言中都是不可用的。

for user in users: 
    sql = userTable.insert().values(user) 
    print(sql) #this line causes the exception 

    conn.execute(sql) 

無可否認sqlalchemy documentation指出,MySQL後端應該支持這一點。就個人而言,我不會依賴於不便攜或非標準的東西,並堅持每行一個插入調用或明確的方法。

編輯關於print語句

正如我在我的評論中提到,該方法打印調用查詢的這種表示不知道方言。 但是,您可以檢索您的查詢的方言版是這樣的:

from sqlalchemy.dialects import mysql 
print str(q.statement.compile(dialect=mysql.dialect())) 

信貸,信貸是由於:Blog post

+0

我真正需要的是一批insert.Conn.execute(mutRowsInsertSql)可以工作,但打印(mutRowsInsertSql)不是。 –

+0

好的。所以我猜想,在這種情況下'print'調用的方法不知道方言(從引擎傳遞到連接,但無法傳遞到Table類)並使用標準方法。 – AndreasT