【问题标题】:how can i call mysql function using sqlalchemy in python?如何在 python 中使用 sqlalchemy 调用 mysql 函数?
【发布时间】:2021-04-23 09:55:23
【问题描述】:

我正在尝试从 python 调用 mysql 中的一个函数,这是我的代码 使用 sqlalchemy

CREATE DEFINER=`root`@`localhost` FUNCTION `my_function`() RETURNS int
    READS SQL DATA
    DETERMINISTIC
BEGIN
insert into employeedata (select * from employee where joiningdate <'20160101');


RETURN 1;
END
engine=sqlalchemy.create_engine('mysql+pymysql://root:root@localhost:3306/sasft')

pd.read_sql_query("select my_function()", engine)

也尝试使用 MySQL 连接器。

函数是通过工作台而不是从 python 调用的。它没有给我任何它正在执行的错误,但结果没有改变。

【问题讨论】:

  • 结果不变是什么意思?你有任何数据吗?可以打印以下吗? table_df = pd.read_sql_table(table_name, con=engine) 然后用table_df.head() 打印table_name 是您的任何 MySQL 表吗?
  • @josemrivera 我没有读取表,调用存储在 mysql 中的函数。从蟒蛇。调用函数后,员工表记录应该插入到员工数据表中
  • 是的,但为了测试连接,我建议做一个简单的表格读取。连接正常吗?
  • @josemrivera 是的,它适用于简单的表格读取

标签: python mysql pandas database sqlalchemy


【解决方案1】:

如果你只想运行一个函数,你不需要使用 Pandas SQL 接口。您可以使用以下内容:

from sqlalchemy import text

with engine.connect() as connection:
    result = connection.execute(text("SELECT my_function()"))
    print(result)

参考:Understanding Autocommit

text() 然后将“强制”此自动提交。

另一种方法是使用具有显式 autocommit 执行选项的上下文管理器:

with engine.connect().execution_options(autocommit=True) as connection:
   connection.execute("SELECT my_function()")

要使用 SQLalchemy 连接而不是 Pandas API 测试 MWE 示例,假设您想从表 table_name 中读取 10 个项目:

with engine.connect() as connection:
    rs = connection.execute("SELECT * FROM table_name LIMIT 10")
    for row in rs:
        print(row)

【讨论】:

  • 您是否收到任何错误消息?我刚刚测试(我会更新答案),代码是正确的。
  • 不,我没有收到任何错误消息。使用 pd.read_sql_query("select my_function()", engine) 时,它也返回 1,但表中的记录没有被插入。是的,我已经测试过with engine.connect() as con: rs = con.execute('SELECT * FROM table_name LIMIT 10') for row in rs: print(row) 它工作正常
  • 也许这与 SQLAlchemy 的自动提交的性质有关:stackoverflow.com/a/51565174/2381477 你可以试试我将在答案中发布的替代方案吗?
  • 通过使用text(),我们可能会解决 SQLAlchemy 没有检测到它必须提交操作的问题。
  • 我收到了这个NameError: name 'text' is not defined
猜你喜欢
  • 2016-12-17
  • 2018-02-15
  • 2021-03-16
  • 2020-07-24
  • 2017-11-11
  • 2017-11-17
  • 1970-01-01
  • 2014-05-23
  • 2015-06-04
相关资源
最近更新 更多