在Python中执行SQL:格式化结果集

10 浏览
0 Comments

在Python中执行SQL:格式化结果集

我有一个Python脚本,可以使用SQL在Python中查询GIS数据库:

import sys
import arcpy
try:
    arcpy.env.workspace = sys.path[0]
    egdb_conn = arcpy.ArcSDESQLExecute(r"Database Connections\Connection1.sde")
    sql_statement = """SELECT * FROM USER1.A_TEST_TABLE"""
    sql_statement_list = sql_statement.split(";")
    print("+++++++++++++++++++++++++++++++++++++++++++++\n")
    # 对于每个传入的SQL语句,执行它。
    for sql in sql_statement_list:
        print(sql)
        try:
            egdb_return = egdb_conn.execute(sql)
        except Exception as err:
            print(err)
            egdb_return = False
        if isinstance(egdb_return, list):
            for row in egdb_return:
                print(row)
            print("+++++++++++++++++++++++++++++++++++++++++++++\n")
        else:
            if egdb_return == True:
                print("SQL语句:{0} 执行成功。".format(sql))
            else:
                print("SQL语句:{0} 失败。".format(sql))
            print("+++++++++++++++++++++++++++++++++++++++++++++\n")
except Exception as err:
    print(err)

脚本运行得很好,但输出的结果有点难以阅读:

+++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM INFRASTR.A_TEST_TABLE
[1, u'1', u'APPLE', 0.1]
[2, u'2', u'PEAR', 0.2]
[3, u'3', u'BANANA', 0.3]
[4, u'4', u'MANGO', 0.4]
[5, u'5', u'ORANGE', 0.5]
[6, u'6', u'BLUEBERRY', 0.6]
[7, u'7', u'STRAWBERRY', 0.7000000000000001]
[8, u'8', u'RASPBERRY', 0.8]
[9, u'9', u'KIWI', 0.9]
[10, u'10', u'PINEAPPLE', 1.0]
+++++++++++++++++++++++++++++++++++++++++++++

如果结果集能以更传统的表格格式输出会很有帮助。像这样的格式会很好(尽管我并不完全固定于这种布局):

 OBJECTID  ID  TYPE        COST 
 1         1   APPLE       0.01 
 2         2   PEAR        0.02 
 3         3   BANANA      0.03 
 4         4   MANGO       0.04 
 5         5   ORANGE      0.05 
 6         6   BLUEBERRY   0.06 
 7         7   STRAWBERRY  0.07 
 8         8   RASPBERRY   0.08 
 9         9   KIWI        0.09 
 10        10  PINEAPPLE   1.00 

我该如何做到这一点?我不确定如何格式化这些值,因为它们是一个列表。我对于将COST格式化为货币并不太担心;我可以在SQL中完成这个任务。

0
0 Comments

从Python执行SQL:格式化结果集

在使用Python执行SQL查询时,我们通常会得到一个结果集。默认情况下,结果集以元组的形式返回,每个元组代表查询结果中的一行数据。然而,有时我们希望将结果集格式化为其他数据结构,以便更方便地处理和分析数据。

在这种情况下,我们可以将结果集转换为字典或pandas的数据帧。下面是一个示例代码,演示了如何将结果集转换为字典,并将字典列表转换为pandas数据帧。

import pandas
# 定义一个空列表,用于存储字典
s = []
# 遍历结果集中的每一行数据
for row in egdb_return:
    # 定义一个空列表,用于存储当前行的数据
    r = []
    r.append(row)
    
    # 创建一个字典,用于存储当前行的数据
    d = {}
    d["ObjectId"] = r.[1]
    d["ID"] = r[2]
    d["Type"] = r[3]
    d["Cost"] = r[4]
    
    # 将字典添加到列表中
    s.append(d)
# 将字典列表转换为pandas数据帧
Table = pandas.dataframe(s)
# 打印数据帧
print(Table)

在上面的代码中,我们首先创建了一个空列表s,用于存储字典。然后,我们遍历结果集中的每一行数据,将当前行的数据存储在一个临时列表r中。接下来,我们创建一个字典d,将当前行的数据以键值对的形式存储在字典中。最后,我们将字典添加到列表s中。

完成以上步骤后,我们使用pandas的dataframe函数将字典列表s转换为一个pandas数据帧Table。最后,我们打印出数据帧Table,以检查转换结果是否正确。

通过将结果集转换为字典或pandas数据帧,我们可以更加方便地处理和分析数据。这种转换方法可以应用于各种场景,帮助我们在使用Python执行SQL查询时更高效地处理结果集。

0
0 Comments

问题的原因是,使用该方法在执行SQL查询后,将结果集格式化输出时,如果需要将结果集的每一行按照指定的宽度左对齐显示,就需要使用这种方法。这种方法使用了字符串的format方法和格式化字符串来实现。

解决方法是,首先需要准备一个长度为结果集行数的格式化字符串模板。模板中的每个部分都是"{:<15}",表示每个字段占用15个字符的宽度,并且左对齐显示。然后,通过format方法将结果集中的每个字段传入模板中,将结果集中的每一行都格式化成指定宽度的字符串。最后,使用print函数将格式化后的结果集打印出来。

这种方法的优点是简单易懂,不需要引入任何新的库或模块,只使用了Python内置的字符串格式化方法。但是,它也有一些局限性,比如每个字段都需要手动指定宽度,如果字段长度超过指定宽度,可能会导致显示不完整。另外,如果结果集中的字段个数发生变化,就需要手动修改格式化字符串模板,不够灵活。

总之,通过这种方法可以方便地将SQL查询的结果集格式化输出,并且可以按照指定的宽度左对齐显示。如果对显示效果有更高的要求,可以考虑使用其他库或模块来实现更复杂的格式化功能。

0