如何从python中的sqlite表中获取数据行数

时间:2014-02-17 12:34:33

标签: python sqlite

我试图在python中获取从sqlite3数据库返回的行数,但似乎该功能不可用:

php

中考虑mysqli_num_rows() mysql

虽然我设计了一种方法,但它很尴尬:假设一个类执行sql并给我结果:

# Query Execution returning a result
data = sql.sqlExec("select * from user")
# run another query for number of row checking, not very good workaround
dataCopy = sql.sqlExec("select * from user")
# Try to cast dataCopy to list and get the length, I did this because i notice as soon 
# as I perform any action of the data, data becomes null
# This is not too good as someone else can perform another transaction on the database 
# In the nick of time
    if len(list(dataCopy)) :
        for m in data :
            print("Name = {}, Password = {}".format(m["username"], m["password"]));
    else :
        print("Query return nothing")

是否有能够在没有压力的情况下做到这一点的功能或属性。

9 个答案:

答案 0 :(得分:5)

通常cursor.rowcount会为您提供查询结果的数量。

但是,对于SQLite,由于SQLite生成结果的性质,该属性通常设置为-1。如果没有COUNT()查询首先,您通常不会知道返回的结果数。

这是因为SQLite在数据库中找到行时会产生行,并且本身不知道在到达数据库末尾之前会产生多少行。

来自cursor.rowcount的文档:

  

虽然Cursor模块的sqlite3类实现了这个属性,但数据库引擎自己支持确定“受影响的行”/“选择的行”是古怪的。

     

对于executemany()语句,修改次数总计为rowcount

     

根据Python DB API Spec的要求,如果对游标没有执行rowcount,则executeXX()属性“为-1,或者接口无法确定最后一个操作的rowcount ”。 这包括SELECT语句,因为在获取所有行之前,我们无法确定查询生成的行数。

强调我的。

对于您的特定查询,您可以添加一个子选择来添加列:

data = sql.sqlExec("select (select count() from user) as count, * from user")

然而,这对于大型表来说效率并不高。

如果您只需一行,请改为使用cursor.fetchone()

cursor.execute('SELECT * FROM user WHERE userid=?', (userid,))
row = cursor.fetchone()
if row is None:
    raise ValueError('No such user found')

result = "Name = {}, Password = {}".format(row["username"], row["password"])

答案 1 :(得分:5)

使用以下内容:

dataCopy = sql.sqlExec("select count(*) from user")
values = dataCopy.fetchone()
print values[0]

答案 2 :(得分:5)

我发现在非常大的数据库上,带有count()的select语句运行缓慢。此外,使用fetch all()可能会占用大量内存。

除非您明确设计数据库以使其不具有rowid,否则您始终可以尝试快速解决方案

cur.execute("SELECT max(rowid) from Table")
n = cur.fetchone()[0]

这将告诉您数据库有多少行。

答案 3 :(得分:1)

import sqlite3
conn = sqlite3.connect(path/to/db)
cursor = conn.cursor()
cursor.execute("select * from user")
results = cursor.fetchall()
print len(results)

len(结果)就是你想要的

答案 4 :(得分:1)

这里一个简单的替代方法是使用fetchall将列拉入python列表,然后计算列表的长度。我不知道这是pythonic还是特别有效,但似乎有效:

class ScrollImageViewController: UIViewController, UIScrollViewDelegate {

    @IBOutlet weak var pageControl: UIPageControl!
    @IBOutlet weak var scrollImage: UIScrollView!
    @IBOutlet weak var numberOfPagesLabel: UILabel!

    private var imageView: UIImageView!

    var imagesArray = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.pageControl.numberOfPages = imagesArray.count

        self.numberOfPagesLabel.layer.cornerRadius = 15.0
        self.numberOfPagesLabel.clipsToBounds = true
        self.numberOfPagesLabel.text = "\(self.pageControl.currentPage)/\(self.imagesArray.count)"

        for i in 0..<imagesArray.count {

            imageView = UIImageView()
            imageView.sd_setImage(with: URL(string: imagesArray[i]))
            imageView.contentMode = .scaleAspectFit
            let xPosition = self.view.frame.width * CGFloat(i)
            imageView.frame = CGRect(x: xPosition, y: 0, width: self.scrollImage.frame.width, height: self.scrollImage.frame.height)

            scrollImage.contentSize.width = scrollImage.frame.width * CGFloat(i + 1)
            scrollImage.addSubview(imageView)

        }
    }
    func scrollViewDidScroll(_ scrollView: UIScrollView) {

        let currentPage = scrollImage.contentOffset.x / UIScreen.main.bounds.size.width

        if pageControl.currentPage < imagesArray.count {
            self.pageControl.currentPage += 1
            self.numberOfPagesLabel.text = "\(self.pageControl.currentPage + 1)/\(self.imagesArray.count)"
        } else if pageControl.currentPage != 0 {
            self.pageControl.currentPage -= 1
            self.numberOfPagesLabel.text = "\(self.pageControl.currentPage - 1)/\(self.imagesArray.count)"
        }    
        pageControl.currentPage = Int(currentPage)
    }
}

答案 5 :(得分:0)

这段代码对我有用:

import sqlite3
con = sqlite3.connect(your_db_file)
cursor = con.cursor()
result = cursor.execute("select count(*) from your_table") #returns array of tupples
num_of_rows = result[0][0]

答案 6 :(得分:0)

当您只需要预先估算时,只需使用COUNT():

n_estimate = cursor.execute("SELECT COUNT() FROM user").fetchone()[0]

要在获取数据之前获取确切的数字,请使用锁定的“ Read transaction”,在此期间不会从外部更改表,例如:

cursor.execute("BEGIN")  # start transaction
n = cursor.execute("SELECT COUNT() FROM user").fetchone()[0]
# if n > big: be_prepared()
allrows=cursor.execute("SELECT * FROM user").fetchall()
cursor.connection.commit()  # end transaction
assert n == len(allrows)

注意:普通的SELECT也会锁定-但直到它本身被完全提取或光标关闭或commit() / END或其他操作隐式结束事务为止... < / p>

答案 7 :(得分:0)

以下脚本有效:

def say():
    global s #make s global decleration    
    vt = sqlite3.connect('kur_kel.db') #connecting db.file
    bilgi = vt.cursor() 
    bilgi.execute(' select count (*) from kuke ') #execute sql command
    say_01=bilgi.fetchone() #catch one query from executed sql
    print (say_01[0]) #catch a tuple first item
    s=say_01[0] # assign variable to sql query result
    bilgi.close() #close query
    vt.close() #close db file

答案 8 :(得分:0)

我喜欢

cursor.execute("select count(*) from my_table")
results = cursor.fetchone()
print(results[0])