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 查询计数