这是我在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在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行。 而且大熊猫也不会读取所有数据。
答案 0 :(得分:1)
我能想到的只是.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变量来查看是否有变化。