Извлечение данных из sql в python (один раз в секунду) - PullRequest
2 голосов
/ 22 февраля 2020

как извлечь данные из sql в python? У меня есть этот код, но он повторяет все значения, а это не то, что я хочу. У меня sh будут новые обновленные данные sql, которые будут в моем python. Я почти поражен в течение нескольких дней .. Любая душа, пожалуйста, я использую sqlserver2012, python

import time
sql_conn = connectSQLServer('ODBC Driver 13 for SQL Server', 'DESKTOP-K6A10IO\SQLEXPRESS', 'display')

mycursor = sql_conn.cursor()

a = 0
while True:
    try:
        time.sleep(1)
        a=a+1
        print(a)
        sql = "SELECT * FROM dbo.LiveStatsFromSQLServer"    
        mycursor.execute(sql)

        myresult = mycursor.fetchall()

        for x in myresult:
            print(x)


    except Exception as error:
        print("Nothing in database\n")
        print(error)
sql_conn.commit()
The result shown is 
1
(1625, 3)
(1626, 0)
(1627, 10)
2
(1625, 3)
(1626, 0)
(1627, 10)
3
(1625, 3)
(1626, 0)
(1627, 10)
(1622, 20)
while i wish to have a constantly updating to the end of the list like:
(1625, 3)
(1626, 0)
(1627, 10)
after 1 second
(1622, 20)
after 1 second
(1612, 10)

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Если я правильно понимаю, вы хотите видеть только новые записи (добавленные после предыдущего запроса). Вам нужно добавить несколько логик c в ваше приложение.

Ваша таблица, вероятно, уже имеет автоматически увеличенный идентификатор (или какая-то временная метка могла бы подойти). После каждого запроса вам нужно запомнить максимальное значение, которое вы получили, и последующий запрос должен содержать предложение WHERE (ie WHERE ID > nnnnn), чтобы вы могли получать только записи с идентификатором больше , чем это максимальное значение из вашего предыдущего запроса.

В качестве альтернативы вы можете использовать значение datetime, но оно может быть менее точным (если вы не возражаете против некоторого совпадения).

Этот запрос просто возвращает все.

PS: я не знаю, почему у вас есть коммит в вашем блоке обработки исключений. Вы не делаете здесь никаких транзакций, вы также не записываете какие-либо данные в БД. Переменная a не используется.

1 голос
/ 22 февраля 2020

Если редактирование схемы таблицы недоступно, возможно, можно приблизиться к тому, что вы хотите, следующей строкой ...

  for row in cursor.execute("""SELECT num,id ,row_number() partition by (select 1) FROM dbo.LiveStatsFromSQLServer"""): 

Редактировать

Поскольку вы можете изменить схему, добавьте столбец для датирования, отредактированный в таблице, к которой вы обращаетесь.

 for row in cursor.execute("""SELECT num,id FROM dbo.LiveStatsFromSQLServer where datetime> dateadd(s,-1,getdate())"""): 
...