gpt4 book ai didi

python - 为什么我没有在 python 变量中恢复与表中的 SQL 相同的计数

转载 作者:行者123 更新时间:2023-11-28 18:40:54 25 4
gpt4 key购买 nike

这是我在 Stack Overflow 中的第一篇文章,我尽量做到简洁。我在 SQL 方面有一些经验,但我才刚刚开始编写 python 代码。我在 python 变量中获取 SQL 数据时得到了一个奇怪的结果,似乎我做错了什么我找不到。

SQL 查询显示我的 SQLite 表有 26244 行:

table = 'DatosLaboratorio' 
SQLQuery = "SELECT COUNT(*) FROM %s" % table
rows = cursor.execute(SQLQuery).fetchone()[0]
print(rows)

26244

然而,当我尝试汇总表时,python 没有恢复相同的数字:

SQLQuery = "SELECT familia, COUNT(*) as num FROM %s GROUP BY familia ORDER BY familia" % table
rows = cursor.execute(SQLQuery).fetchall()
conn.commit()
# sum totals previously grouped in field 1 (num)
count=0
for row in rows:
count=count+row[1]
print(count)

8862

我已经验证了针对 SQLite 的直接 SQL 查询给出了正确的数字:

select sum(num) as total from 
(select familia, count (*) as num from DatosLaboratorio group by familia)

total
26244

更糟糕的是,当我尝试使用 pandas 在 DataFrame 中获取数据时,我没有得到相同的计数,似乎 pandas 只读取了 33 个有效行,但我在所有 26244 条记录中都有值:

SQLQuery = "SELECT * FROM %s" % table
df = pd.read_sql (SQLQuery,conn)
conn.commit()
df.count()

ID 33
seccion 0
fecha 33
familia 33
codigo 33
extractoseco 33
materiagrasa 33
sal 33
ph 33
observaciones 33
phsalmuera 0
temperaturasalmuera 4
densidadsalmuera 4

我错过了什么?预先感谢您的帮助!


@Hrabal:添加输出

这是在 SQLite 上查询的 SQL 输出:

select familia, count (*) as num from DatosLaboratorio group by familia

RecNo familia num
1 CABRA BARRA TIERNO 297
2 CABRA MADURADO 3 KG 29
3 CABRA MADURADO MINI 44
4 CABRA TIERNO 3 KGS 140
5 CABRA TIERNO BARRA 4,2 50
6 CABRA TIERNO MINI 258
7 GRAN CAPITAN 3 KGS 2
8 MADURADO 3 KG SL 2588
9 MADURADO 3 KGS IQM 315
10 MADURADO 3 KGS S/LIS 308
11 MADURADO 3KG CL 1229
12 MADURADO BARRA 1585
13 MADURADO BARRA 4,2 523
14 MADURADO BARRA IQM 60
15 MADURADO BARRA IQM 4,2 41
16 MADURADO MINI 1393
...
50 TIERNO MINI IQM 142
51 TIERNO MINI LIGHT 572
52 TIERNO PÑO 323
53 TIERNO PÑO IQM 2124
54 TIERNO SOJA 3 KGS 3
55 TIERNO SOJA BARRA 14
56 TIERNO SOJA MINI 4

所以结果是 56 行,数据按“familia”分组,sum(“num”) = 26244

当我从 python 打印时,它似乎没有读取所有数据:

SQLQuery = "SELECT familia, COUNT(*) as num FROM %s GROUP BY familia ORDER BY familia" % table
rows = cursor.execute(SQLQuery).fetchall()
conn.commit()
columns = [column[0] for column in cursor.description]
print(columns)
for row in rows:
print (row[0],row[1])

['familia', 'num']
CABRA BARRA TIERNO 297
CABRA MADURADO 3 KG 29
CABRA MADURADO MINI 44
CABRA TIERNO 3 KGS 140
CABRA TIERNO BARRA 4,2 50
CABRA TIERNO MINI 258
GRAN CAPITAN 3 KGS 2
MADURADO 3 KG SL 2588
MADURADO 3 KGS IQM 315
MADURADO 3 KGS S/LIS 308
MADURADO 3KG CL 1229
MADURADO BARRA 1585
MADURADO BARRA 4,2 523
MADURADO BARRA IQM 60
MADURADO BARRA IQM 4,2 41
MADURADO MINI 1393

这就是 python 正在读取的所有数据,显然:前 16 行,或者至少我无法获取其余数据。它应该读取 56 行。pandas 也不会读取所有数据。

最佳答案

我能想到的是 .fetchall() 中的问题..因为 python 只给你前 16 行,fetchall() 不工作所以尝试使用 .fetchone()(如果你有一个小数据集)或一个带有 .fetchmany() 的生成器:

def ResultGenerator(cursor, arraysize=8):
while True:
results = cursor.fetchmany(arraysize)
if not results:
break
for result in results:
yield result

cursor = con.cursor()
SQLQuery = "SELECT familia, COUNT(*) as num FROM %s GROUP BY familia ORDER BY familia" % table
cursor.execute(SQLQuery)

for row in ResultGenerator(cursor):
print (row[0],row[1])

这样 python 一次只获取 8 行,消耗更少的内存(也许这就是问题所在?)。

尝试使用 arraysize 变量看看是否有变化。

资源: Python generators are fun

关于python - 为什么我没有在 python 变量中恢复与表中的 SQL 相同的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26204018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com