【问题标题】:getting only updated data from database仅从数据库中获取更新的数据
【发布时间】:2015-12-14 10:12:38
【问题描述】:

我必须从数据库中获取最近更新的数据。为了解决它,我将最后读取的行号保存到python的shelve中。以下代码适用于像select * from rows 这样的简单查询。我的代码是:

from pyodbc import connect
from peewee import *
import random
import shelve
import connection


d = shelve.open("data.shelve")
db = SqliteDatabase("data.db")
class Rows(Model):
    valueone = IntegerField()
    valuetwo = IntegerField()

    class Meta:
        database = db

def CreateAndPopulate():
    db.connect()
    db.create_tables([Rows],safe=True)
    with db.atomic():
        for i in range(100):
            row = Rows(valueone=random.randrange(0,100),valuetwo=random.randrange(0,100))
            row.save()
    db.close()

def get_last_primay_key():
    return d.get('max_row',0)

def doWork():
    query = "select * from rows" #could be anything
    conn = connection.Connection("localhost","","SQLite3 ODBC Driver","data.db","","")
    max_key_query = "SELECT MAX(%s) from %s" % ("id", "rows")
    max_primary_key = conn.fetch_one(max_key_query)[0]
    print "max_primary_key " + str(max_primary_key)
    last_primary_key = get_last_primay_key()
    print "last_primary_key " + str(last_primary_key)
    if max_primary_key == last_primary_key:
        print "no new records"
    elif max_primary_key > last_primary_key:
        print "There are some datas"
        optimizedQuery = query + " where id>" + str(last_primary_key) 
        print query
        for data in conn.fetch_all(optimizedQuery):
            print data
        d['max_row'] = max_primary_key
    # print d['max_row']

# CreateAndPopulate() # to populate data
doWork()

虽然代码适用于没有where 子句的简单查询,但查询可以是从简单到复杂的任何内容,具有joins 和多个where 子句。如果是这样,那么我添加where 的部分将失败。无论查询是什么,我如何才能从数据库中获取最后更新的数据?

PS:我无法修改数据库。我只需要从中获取。

【问题讨论】:

  • “失败”是什么意思?你得到什么错误\错误的结果?一个例子会很有用......
  • 考虑像select * from table_name join another_table on ... 这样的sql,现在添加where id>... 不会给我想要的结果

标签: python sqlite python-2.7 pyodbc


【解决方案1】:

使用 OFFSET 子句。例如:

SELECT * FROM [....] WHERE [....] LIMIT -1 OFFSET 1000

在您的查询中,将 1000 替换为绑定到您的 shelve 变量的参数。这将跳过顶部“搁置”的行数,只抓取较新的行。您可能最终会考虑进行更健壮的重构,但祝您好运。

【讨论】:

  • 基于链接stackoverflow.com/questions/10491492/… 我使用了limit -1 offset 1000。我会试试这段代码,让你知道
  • 我已经修改了我的答案 - 自从我直接使用 SQLite 并且忘记了需要 LIMIT 已经有一段时间了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 2017-12-28
相关资源
最近更新 更多