为什么我在python变量中恢复的计数与从表中恢复SQL的计数不同

为什么我在python变量中恢复的计数与从表中恢复SQL的计数不同,python,sql,pandas,Python,Sql,Pandas,这是我在Stack Overflow中的第一篇文章,我正在尽可能简洁。 我在SQL方面有一些经验,但我刚刚开始编写python代码。 我得到了一个奇怪的结果,在python变量中获取SQL数据,似乎我做了一些找不到的错误 我的SQLite表得到26244行,如SQL查询所示: table = 'DatosLaboratorio' SQLQuery = "SELECT COUNT(*) FROM %s" % table rows = cursor.execute(SQLQuery).fetcho

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

我的SQLite表得到26244行,如SQL查询所示:

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获取数据帧中的数据时,我没有得到相同的计数,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分组,sumnum=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行。
熊猫也不会读取所有数据。

我所能想到的是.fetchall中的一个问题。。 由于python只提供前16行,fetchall不起作用,因此如果您有一个小数据集或带有.fetchmany的生成器,请尝试使用.fetchone

这样python一次只能获取8行,占用的内存更少,这可能就是问题所在

尝试使用arraysize变量查看是否有更改

资源:

只是猜测,但是否要使用第[0]行而不是第[1]行?如果不是这样,我肯定会从从python打印行开始,看看这是否与处理零或缺少值有关。所有这些RAW都有主键吗?我曾经在sqlite中遇到过一些奇怪的情况,其中一些行的主键为空,并且给出了错误的输出。您可以发布一段select familia,count*as num,来自DatosLaboratorio group by familia吗?来自直接sqlite查询和python的AUTPUT?tnx@JohnE:一开始我确实打印了所有的结果,但由于空间有限,我没有在这里发布。现在我添加了更详细的内容output@ustun:未定义主键,事实上,表中根本没有键。Hrabal:您的代码可以工作,但我仍然得到16行,无论arraysize的大小。我测试了8、16、32和56,得到的结果总是一样的:16行。奇怪的
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])