【问题标题】:Django: get result of raw SQL query in one lineDjango:在一行中获取原始 SQL 查询的结果
【发布时间】: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] 试试这个。
  • 这就是功能

标签: sql django postgresql psycopg2


【解决方案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() 这样的“短”方法实际上是数百行代码。您可以编写自己的方法来执行此操作,但您编写的总代码一定会超过一行。
    猜你喜欢
    • 2020-01-09
    • 2015-07-13
    • 2021-10-12
    • 2015-05-05
    • 1970-01-01
    • 2013-04-17
    • 2015-11-21
    • 2012-03-16
    • 1970-01-01
    相关资源
    最近更新 更多