Django:在一行中获取原始 SQL 查询的结果

Posted

技术标签:

【中文标题】Django:在一行中获取原始 SQL 查询的结果【英文标题】:Django: get result of raw SQL query in one line 【发布时间】:2017-03-11 02:13:11 【问题描述】:

这行得通:

connection = get_connection()
cursor=connection.cursor()
cursor.execute('show application_name')
application_name_of_connection=cursor.fetchone()[0]

但是为什么是四行呢?有没有办法在一行中得到这个?

【问题讨论】:

我从未见过一种语言可以在一行中连接、查询和获取结果集。你为什么要这个? @TimBiegeleisen 我想要这个,因为我希望我的代码简单易读。 (“我讨厌代码,我希望在我们的产品中尽可能少地使用代码。”——Jack Diederich) 在 Java 等语言中,反对转向函数式风格的一个论据是,虽然它减少了代码行数,但它增加了更少代码行的复杂性。一切都是取舍。 application_name_of_connection = get_connection().cursor().execute('show application_name').fetchone()[0] 试试这个。 这就是功能 【参考方案1】:

这可以通过理解来完成,但在 sqlite 上:

results = [row[0] for row in get_connection().cursor().execute('select * from mytable')]

如果您使用的是 postgresql,那么它不起作用,您可以尝试使用更紧凑的形式:

with get_connection().cursor() as cur:
    cur.execute('show all')
    print cur.fetchone()

如果您需要在块执行后丢弃光标。

我没有尝试过其他数据库管理器,结果可能会有所不同。

【讨论】:

【参考方案2】:

不,没有办法在一行中做到这一点。诸如 Python 之类的语言旨在描述一组指令。这里有四个指令。甚至可能有辅助方法或这些语句的巧妙/低效安排可以将其降低到三行,但您最好保持原样。

例如,如果你因为某种原因经常使用这段代码,你可以把它封装在它自己的方法中

def get_application_name_of_connection()
    connection = get_connection()
    cursor=connection.cursor()
    cursor.execute('show application_name')
    return cursor.fetchone()[0]

然后简单地说:

get_application_name_of_connection()

这就是它的工作原理。你想要更少的代码?隐藏功能。

【讨论】:

想象一下我想得到大约十个这样的值:postgres 服务器版本、服务器的日期时间、允许的连接数.....我认为像“从 sql 查询中获取单个值”这样的方法会生成行数最少的代码。 当然,如果 Django 提供了这样的方法,它会的。不幸的是,事实并非如此。请记住,在幕后,所有这些像get_connection() 这样的“短”方法实际上是数百行代码。您可以编写自己的方法来执行此操作,但您编写的总代码一定会超过一行。

以上是关于Django:在一行中获取原始 SQL 查询的结果的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5 Eloquent 中获取原始 SQL 查询的结果

在 Django shell 会话期间获取 SQL 查询计数

在django中,执行原始sql语句

如何从 Java 中的 Oracle SQL 选择中获取原始脚本输出而不是查询结果

在 django 中获取最后插入的 id

Django 视图中的原始 SQL 查询