2017-04-27 4 views
0

dictのリストにデータがあります.dbにデータを挿入しようとしましたが、エラーが発生しますsqlalchemy.exc.CompileError:現在のデータベースバージョン設定での 'default'ダイアレクトは、インプレース複数挿入をサポートしていません。現在のデータベースバージョン設定の「デフォルト」ダイアレクトは、インプレイス複数行の挿入をサポートしていません

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

dictsのリストを反復処理し、dictsを個別に渡す場合は、それが機能するか試してみてください。あなたがしようとしているのは、すべての方言で利用できる特別な構文を使用しています。

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

    conn.execute(sql) 

確かに、sqlalchemy documentationは、MySQLのバックエンドがこれをサポートするはずです。個人的には、私はポータブルでも非標準でもないものに依存せず、行ごとに1つのインサートコール、または明示的なbulk_insertメソッドを使用します。私は私のコメントで述べたようにprint文

について

編集、クエリのこの表現の方法印刷呼び出しは意識方言れていません。ただし、このようなクエリの方言のバージョンを取得することができ :クレジットが原因である

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

クレジット:Blog post

+0

私は本当にinsert.Conn.execute(mutRowsInsertSql)が動作することができますバッチが、印刷で必要なもの(mutRowsInsertSql)ではありません。 –

+0

だから私は、 'print'がこの場合呼び出すメソッドは、方言(エンジンから接続に渡されますが、テーブルクラスにはどこにも渡されません)を認識せず、標準のものを使用していると推測します。 – AndreasT

関連する問題