Python 3.x ';默认值';具有当前数据库版本设置的方言不支持就地多行插入

Python 3.x ';默认值';具有当前数据库版本设置的方言不支持就地多行插入,python-3.x,sqlalchemy,Python 3.x,Sqlalchemy,我的dict列表中有数据,我试图将数据插入数据库,但出现错误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

我的dict列表中有数据,我试图将数据插入数据库,但出现错误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:268454@localhost: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)即可完美运行。如果您反复查看dict列表并逐个传入dict,请尝试是否有效。你要做的是使用一种特殊的语法,这在所有方言中都不可用

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:268454@localhost: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()
for user in users:
  sql = userTable.insert().values(user)
  print(sql) #this line causes the exception

  conn.execute(sql)
无可否认,MySQL后端应该支持这一点。就我个人而言,我不会依赖于不可移植或非标准的东西,坚持每行一次插入调用,或者使用显式的
bulk\u insert
方法

编辑有关打印报表的信息

正如我在评论中提到的,print调用查询的这种表示形式的方法不支持方言。 但是,您可以检索查询的方言版本,如下所示:

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

积分到期时的积分:

我真正需要的是批插入。Conn.execute(mutRowsInsertSql)可以工作,但print(mutRowsInsertSql)不能。Ok。因此,我猜想,
print
在本例中调用的方法不知道方言(从引擎传递到连接,但没有传递到表类),而是使用标准方言。