如果仅用于原始 sql,SQLAlchemy 的性能?

Posted

技术标签:

【中文标题】如果仅用于原始 sql,SQLAlchemy 的性能?【英文标题】:SQL Alchemy performance if used only for raw sql? 【发布时间】:2012-08-05 09:05:58 【问题描述】:

我打算在 Django 项目中使用非常简单的原始 SQL。 示例:

SELECT name,doc_id,doc_content,creation_date from doc_table where uid = 'xxx' limit 1 ;

主要要求:

易于执行 SQL 查询和获取数据 - 例如。如果我使用 mysqldb ,我不想通过游标重复查询,然后处理元组以获取所需数据的字典。

防止 SQL 注入和适当的数据转义。

有两种选择,

a) 使用 SQLAlchemy ,即使仅用于原始 SQL。

b) 使用在 MySQLdb 上编写的包装器,或者编写一个。

我倾向于 SQLAlchemy,因为我已经阅读了很多关于它的好东西。

如果我打算只将它用于简单的原始 SQL,那么与更简单的 MySQLdb 包装器相比,使用 SQLAlchemy 是否会产生任何显着的性能开销,例如 CPU 使用率、内存使用率。 SQLAlchemy 的所有其他电池都没有多大用处。

【问题讨论】:

仅供参考,您可以直接从 MySQLdb 取回 dicts 而无需处理元组。只需添加:import MySQLdb.cursors 并在您的连接调用中添加一个命名参数cursorclass=MySQLdb.cursors.DictCursor。从fetchall() 返回的迭代器将是字典。 所以这里的假设是查询是针对您没有模型的数据库? @sberry 是的,我已经看到了,我想要一个包装器来简化插入、更新和选择。 请看Why is SQLAlchemy insert with sqlite 25 times slower than using sqlite3 directly?的回复。虽然不是mysql,但Mike 发布了一个性能测试示例代码,您可以使用mySQL 将其应用于您的案例并扩展为包括所有CRUD 操作。从那里发布的结果中,我得出结论,仅使用 SQLAlchemy Core 时不应该有任何显着的性能下降。 另请参阅Is SQLAlchemy still recommanded if only used for raw sql query? 的另一个 SO 答案。 【参考方案1】:

根据要求,发布 cmets 作为答案:

请查看Why is SQLAlchemy insert with sqlite 25 times slower than using sqlite3 directly?的答案。虽然不是mysql,但 Mike 发布了一个用于性能测试的示例代码,您可以使用 mySQL 将其应用于您的案例并扩展为包括所有 CRUD 操作。从那里发布的结果来看,我认为仅使用 SQLAlchemy Core 时不会出现任何显着的性能下降。

另请参阅Is SQLAlchemy still recommanded if only used for raw sql query? 的另一个 SO 答案

【讨论】:

以上是关于如果仅用于原始 sql,SQLAlchemy 的性能?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQLAlchemy 从 graphQL 获取已编译的原始 sql?

SQLAlchemy 选择在 SQLite 表上给出不同的结果,原始 sql 与可选

按非主键属性分组 min(Value) 并从同一行加入附加属性(使用原始 SQL 或 SQLalchemy)

Sqlalchemy,原始查询和参数

使用 sqlalchemy 会话执行 sql 会大大减慢执行时间

SQLAlchemy 仅从连接表中选择列