Typowe zapytanie biblioteki MySQLdb może zużywać dużo pamięci i słabo działać w Pythonie, gdy generowany jest duży zestaw wyników. Na przykład:Używanie python MySQLDB SScursor z zapytaniami zagnieżdżonymi
cursor.execute("SELECT id, name FROM `table`")
for i in xrange(cursor.rowcount):
id, name = cursor.fetchone()
print id, name
Jest opcja, że kursor będzie pobierać tylko jeden wiersz na raz, rzeczywiście przyspieszając scenariusz i cięcia zużycie pamięci skryptu dużo.
import MySQLdb
import MySQLdb.cursors
conn = MySQLdb.connect(user="user", passwd="password", db="dbname",
cursorclass = MySQLdb.cursors.SSCursor)
cur = conn.cursor()
cur.execute("SELECT id, name FROM users")
row = cur.fetchone()
while row is not None:
doSomething()
row = cur.fetchone()
cur.close()
conn.close()
Ale nie mogę znaleźć nic na temat korzystania z SSCursor
z zagnieżdżonych zapytań. Jeśli jest to definicja doSomething()
:
def doSomething()
cur2 = conn.cursor()
cur2.execute('select id,x,y from table2')
rows = cur2.fetchall()
for row in rows:
doSomethingElse(row)
cur2.close()
następnie skrypt generuje następujący błąd:
_mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now")
Brzmi jakby SSCursor
nie jest kompatybilny z zagnieżdżonych zapytań. Czy to prawda? Jeśli tak, to źle, ponieważ główna pętla wydaje się działać zbyt wolno przy standardowym kursorze.
python - tak poprawny i tak wolny w tym samym czasie! – shigeta