我正试图从一个随记录增长的数据库表中定期提取记录。我使用Python及其pyodbc包来执行记录的获取。提取时,如何将光标指向最后读取/提取的行的下一行,以便每次提取时只能插入新的记录集。
为了解释更多,
我的桌子上有100条记录,它们都被取出来了。
间隔一段时间后,表中有200条记录,我想从101到200之间获取行。等等。
有办法使用pyodbc游标吗?
或者任何其他建议都会很有帮助。
下面是我正在尝试的代码:
#!/usr/bin/python
import pyodbc
import csv
import time
conn_str = (
"DRIVER={PostgreSQL Unicode};"
"DATABASE=postgres;"
"UID=userid;"
"PWD=database;"
"SERVER=localhost;"
"PORT=5432;"
)
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()
def fetch_table(**kwargs):
qry = kwargs['qrystr']
try:
#cursor = conn.cursor()
cursor.execute(qry)
all_rows = cursor.fetchall()
rowcnt = cursor.rowcount
rownum = cursor.description
#return (rowcnt, rownum)
return all_rows
except pyodbc.ProgrammingError as e:
print ("Exception occured as :", type(e) , e)
def poll_db():
for i in [1, 2]:
stmt = "select * from my_database_table"
rows = fetch_table(qrystr = stmt)
print("***** For i = " , i , "******")
for r in rows:
print("ROW-> ", r)
time.sleep(10)
poll_db()
conn.close()
最佳答案
我认为您不能使用pyodbc或任何其他odbc包来查找“新”行。但是,如果数据库中有一个“timestamp”列,或者如果您可以添加这样一个列(有些数据库允许它作为插入时间自动填充,这样您就不必更改插入查询),那么您可以更改查询,只选择时间戳大于上一个时间戳的行。您可以在每次迭代中不断更改prev_timestamp变量。
def poll_db():
prev_timestamp = ""
for i in [1, 2]:
if prev_timestamp == "":
stmt = "select * from my_database_table"
else:
# convert your timestamp str to match the database's format
stmt = "select * from my_database_table where timestamp > " + str(prev_timestamp)
rows = fetch_table(qrystr = stmt)
prev_timestamp = datetime.datetime.now()
print("***** For i = " , i , "******")
for r in rows:
print("ROW-> ", r)
time.sleep(10)