PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Брой редове на Psycopg2 за курсор от страна на сървъра

В случай на курсор от страна на сървъра, въпреки че cursor.execute() връща, заявката не е задължително да е била изпълнена от сървъра в този момент и така броят на редовете не е достъпен за psycopg2 . Това е в съответствие със спецификацията DBAPI 2.0 което гласи, че rowcount трябва да бъде -1, ако броят на редовете на последната операция е неопределен.

Опитва се да го принуди с cursor.fetchone() , например, актуализира cursor.rowcount , но само по броя на извлечените елементи, така че това не е полезно. cursor.fetchall() ще доведе до rowcount е правилно настроено обаче, което изпълнява пълната заявка и прехвърляне на данни, които искате да избегнете.

Възможно заобиколно решение, което избягва напълно отделна заявка за получаване на броя и което трябва да даде точни резултати е:

select *, (select count(*) from test) from test;

Това ще доведе до това, че всеки ред има добавен брой редове в таблицата като последна колона. След това можете да получите броя на редовете в таблицата с помощта на cursor.fetchone() и след това вземете последната колона:

with db.cursor('cursor_name') as cursor:
    cursor.execute('select *, (select count(*) from test) from test')
    row = cursor.fetchone()
    data, count = row[:-1], row[-1]

Сега count ще съдържа броя на редовете в таблицата. Можете да използвате row[:-1] за препратка към данните на реда.

Това може да забави заявката поради евентуално скъп SELECT COUNT(*) ще се изпълни, но след като приключи, извличането на данните трябва да е бързо.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLAlchemy with_for_update заключване на ред не работи?

  2. PostgreSQL - как да стартирате VACUUM от код извън транзакционния блок?

  3. Как цитирате низове в Postgres

  4. Импортиране на дъмп на postgresql в Heroku

  5. Как Postgresql COPY TO STDIN с CSV се актуализира при конфликт?