【问题标题】:syntax error at 'SELECT LAST_INSERT_ID()''SELECT LAST_INSERT_ID()' 处的语法错误
【发布时间】:2018-12-09 07:15:54
【问题描述】:

如果我在 python 中运行我的查询,它会返回一个语法错误。

但是,如果我使用 navicat 运行它,它就可以正常工作。

为什么它不在 python 中运行?

sql_query

INSERT INTO
    solarsystem
    (
        solarsystemName,
        solarsystemPositionX,
        solarsystemPositionY,
        solarsystemSectorId,
        solarsystemAngle
    ) 
VALUES 
    ('Lima [698/562]',698,562,13,171);

SELECT LAST_INSERT_ID();

错误

1064, u"您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,了解在 'SELECT LAST_INSERT_ID()' 附近使用的正确语法


[编辑]

create.py

[...]

args = (solarsytem['solarsystemName'], solarsytem['x_pos'], solarsytem['y_pos'],
        solarsytem['sector_id'], solarsytem['angle'])

with self.engine.begin() as connection:
    result_proxy = connection.execute(sql_query, args).first()

[...]

更新

如果我尝试将 INSERT 作为单个查询,则可以。

但是,SELECT LAST_INSERT_ID(); 不起作用。它返回:

TypeError:字符串格式化期间并非所有参数都转换

【问题讨论】:

  • 帮助我们帮助你 - 也分享你的 python 代码
  • 您是否尝试过通过两个单独的execute 调用来执行这两个语句?
  • 是的,如果我运行 SELECT LAST_INSERT_ID() FROM solarsystem ; 它会返回 TypeError: not all arguments convert during string formatting(我在没有 args 的情况下运行它)但在 Navicat 中它总是有效的

标签: python mysql python-2.7 sqlalchemy navicat


【解决方案1】:

通过您的连接来获取插入到光标对象上的最后一行 ID,

你可以使用

connection.insert_id()

或者如果你有一个光标:

cursor.lastrowid 

编辑

对于 sqlalchemy,您可以使用:

with self.engine.begin() as connection:
        result_proxy = connection.execute(sql_query, args).first()
        last_id=result_proxy.inserted_primary_key[0]

你的 id 会在last_id

但您必须从 sql_query 中删除 SELECT LAST_INSERT_ID();

【讨论】:

  • AttributeError: 'Connection' 对象没有属性 'insert_id'
  • 使用connection.lastrowid,因为你给你的光标一个连接名
  • AttributeError: 'Connection' object has no attribute 'lastrowid' connection = self.engine.connect() 是连接器而不是游标。还是我弄错了?
  • 它是如何工作的?我做了一个 INSERT 并且什么都不会返回。这是下一个错误:此结果对象不返回行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 2014-03-12
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多