LINUX.ORG.RU

Не могу найти ошибку в скрипте Python

 , ,


0

1

Не могу найти ошибку в скрипте Python...

Выводит 1 строку :

root@BlackPhreaker:~/Desktop/osmocom_script# python print_db_1.py 

259962166   | XXXXXXXXXXXXXX | XXXXXXXXXXXXXX | 2018-11-03 21:04:15 | 2018-11-19 03:47:13 | 2018-11-19 04:48:13 |     2535

А должен выводить 4 строки:

root@BlackPhreaker:~/Desktop/osmocom_script# python print_db_1.py

 
259962166   | XXXXXXXXXXXXXX | XXXXXXXXXXXXXX | 2018-11-03 21:04:15 | 2018-11-19 03:47:13 | 2018-11-19 04:48:13 |     2535

259962166   | XXXXXXXXXXXXXX | XXXXXXXXXXXXXX | 2018-11-03 21:04:15 | 2018-11-19 03:47:13 | 2018-11-19 04:48:13 |     2535

2552628735  | XXXXXXXXXXXXXX | XXXXXXXXXXXXXX | 2018-11-12 23:44:36 | 2018-11-19 03:07:28 | 2018-11-13 00:46:17 |        0

2552628735  | XXXXXXXXXXXXXX | XXXXXXXXXXXXXX | 2018-11-12 23:44:36 | 2018-11-19 03:07:28 | 2018-11-13 00:46:17 |        0
 

#!/usr/bin/python
# -*- coding: utf-8 -*-
#======================================================================================

#======================================================================================

import sqlite3

db = sqlite3.connect('/root/Desktop/hlr.sqlite3')

def read_sql_db():
    with db:
	cur = db.cursor()    
	cur.execute("SELECT s.tmsi as TMSI," #
			"s.imsi as IMSI,"
			"e.imei as IMEI,"
			"s.created as CREATED,"
			"s.updated as UPDATED, " ##/!\##
			"s.expire_lu as EXPIRE,"
			"s.lac as LAC "
			"FROM Subscriber s,"
			"EquipmentWatch ew,"
			"Equipment e "
			"WHERE s.id = ew.subscriber_id")
	while True:
	    row = cur.fetchone()
        
	    if row == None:
		break
	    global TMSIS
	    global IMSIS
	    global IMEIS
	    global CREATED
	    global UPDATED
	    global EXPIRE
	    global LACS
	    TMSIS = row[0]
	    IMSIS = row[1]
	    IMEIS = row[2]
	    CREATED = row[3]
	    UPDATED = row[4]
	    EXPIRE = row[5]  
	    LACS = row[6] 
    	    return TMSIS,IMSIS,IMEIS,CREATED,UPDATED,EXPIRE,LACS
	return None,None,None,None,None,None,None
#			cur.close()
		
read_sql_db()
print("{:11} | {:15} | {:15} | {} | {} | {} | {:8}".format(TMSIS,IMSIS,IMEIS,CREATED,UPDATED,EXPIRE,LACS))

А должен выводить 4

С чего вдруг? У тебя один раз вызывается read_sql_db(), она возвращает одну строку. И избавься от глобалок. Они тебе не нужны.

Ivan_qrt ★★★★★ ()
Ответ на: комментарий от Guest_1488

Если этод код не помещать в функцию то он выводит все 4 строки(то есть весь кортеж)

 
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sqlite3

db = sqlite3.connect('/root/Desktop/hlr.sqlite3')

#cursor = db.cursor()

with db:
    cur = db.cursor()    
    cur.execute("SELECT s.tmsi as TMSI," #
                    "s.imsi as IMSI,"
                    "e.imei as IMEI,"
                    "s.created as CREATED,"
                    "s.updated as UPDATED, " #####
                    "s.expire_lu as EXPIRE,"
                    "s.lac as LAC "
                    "FROM Subscriber s,"
                    "EquipmentWatch ew,"
                    "Equipment e "
                    "WHERE s.id = ew.subscriber_id")
    while True:
        row = cur.fetchone()
        
        if row == None:
            break
        
        TMSIS = row[0]
        IMSIS = row[1]
        IMEIS = row[2]
        CREATED = row[3]
        UPDATE = row[4]
        EXPIRE = row[5]  
        LACS = row[6]  
#        print row[0], row[1], row[2], row[3], row[4]
#        print("{:11} | {:15} | {:15} | {} | {} | {} | {:8}".format(row[0],row[1],row[2],row[3],row[4],row[5],row[6]))
        print("{:11} | {:15} | {:15} | {} | {} | {} | {:8}".format(TMSIS,IMSIS,IMEIS,CREATED,UPDATE,EXPIRE,LACS))
BlackPhreaker ()
Ответ на: комментарий от BlackPhreaker

А после помещение кода в функцию

def read_sql_db(): 

и вызова функции

read_sql_db()
print("{:11} | {:15} | {:15} | {} | {} | {} | {:8}".format(TMSIS,IMSIS,IMEIS,CREATED,UPDATE,EXPIRE,LACS))

он выводит не все данные... Вот в чем проблеммы и переменны следовательно для этого))

BlackPhreaker ()
Ответ на: комментарий от BlackPhreaker

TMSIS = row[0]
IMSIS = row[1]
IMEIS = row[2]
CREATED = row[3]
UPDATE = row[4]
EXPIRE = row[5]
LACS = row[6]

Если я не ошибаюсь, то можно сделать так:

TMSIS, IMSIS, IMEIS, CREATED, UPDATE, EXPIRE, LACS, _ = row

return TMSIS,IMSIS,IMEIS,CREATED,UPDATED,EXPIRE,LACS

У тебя при первой же итерации цикл заканчивается, так как return сразу же выбрасывает из функции.

Guest_1488 ()
Ответ на: комментарий от BlackPhreaker

Я нихрена не понимаю в этих ваших пистонах, но у тебя же внутри цикл, который должен есть строки, пока они не кончатся, и в измененном варианте на каждой итерации (т.е. для каждой строки) печатает то, что съел на данной конкретной итерации, потому и выводит.

В оригинальном варианте он очевидно выкидывается первым же ретурном на первой же итерации цикла. И если ты вынесешь этот ретурн за пределы цикла, то если я правильно непонимаю пистон, тебе вместо первой строки выдаст четвертую. Ну просто потому, что ты одним и тем же переменным наприсваивал разных значенй. Какое последним присвоил - то и напишут.

Потому что с чего ты вообще взял, что у тебя есть кортежи? Откуда они вообще взялись? Почему ты думашь, что если будешь присваивать переменной в цикле разные значения, с неба снизойдет некий кортеж? Откуда вообще взялось слово «кортеж»? Если я правильно непонимаю пистон, кортеж в нем это неизменяемый список, как в неизменяемый список добавлять элементы, если он неизменяемый?

infine ()

На питоне не пишу, код не проверял

Но по смыслу должно быть близко к правде:

import sqlite3

query = """
SELECT s.tmsi as TMSI,
       s.imsi as IMSI,
       e.imei as IMEI,
       s.created as CREATED,
       s.updated as UPDATED,
       s.expire_lu as EXPIRE,
       s.lac as LAC
  FROM Subscriber s,
       EquipmentWatch ew,
       Equipment e
 WHERE s.id = ew.subscriber_id
"""

with sqlite3.connect('/root/Desktop/hlr.sqlite3') as conn:
    for row in conn.execute(query):
        print('{:11} | {:15} | {:15} | {} | {} | {} | {:8}'.format(*row))

Можно, конечно, оформить логику получения данных в виде функции, но тогда лучше её сделать генератором.

А тебе нужно почитать какую-нибудь книжку по программированию, судя по всему, ты вообще не понимаешь, что ты делаешь.

theNamelessOne ★★★★★ ()
Последнее исправление: theNamelessOne (всего исправлений: 1)

В общем и целом, у тебя сплошная наркомания, лучше чем здесь вряд ли напишешь https://docs.python.org/3/library/sqlite3.html

Как-то так:

import sqlite3

conn = sqlite3.connect(':memory:')

with conn:
    conn.execute(
        '''CREATE TABLE stocks
           (date text, trans text, symbol text, qty real, price real)''')
    conn.execute(
        '''INSERT INTO stocks VALUES
           ('2006-01-05','BUY','RHAT',100,35.14),
           ('2006-01-06','BUY','RHAT',101,36.14),
           ('2006-01-07','BUY','RHAT',102,37.14),
           ('2006-01-08','BUY','RHAT',103,38.14)''')


def read_sql_db():
    """ """
    with conn:
        return list(map(lambda x: x, conn.execute('SELECT * FROM stocks')))


result = read_sql_db()
print(result)

for row in result:
    print('{} | {} | {} | {}'.format(*row))

[('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14), ('2006-01-06', 'BUY', 'RHAT', 101.0, 36.14), ('2006-01-07', 'BUY', 'RHAT', 102.0, 37.14), ('2006-01-08', 'BUY', 'RHAT', 103.0, 38.14)]

2006-01-05 | BUY | RHAT | 100.0
2006-01-06 | BUY | RHAT | 101.0
2006-01-07 | BUY | RHAT | 102.0
2006-01-08 | BUY | RHAT | 103.0
vvn_black ★★★★★ ()
Ответ на: комментарий от infine

Если я правильно непонимаю пистон, кортеж в нем это неизменяемый список, как в неизменяемый список добавлять элементы, если он неизменяемый?

кортеж после создания можно заполнить один раз и сделать это в другом месте - не обязательно при инициализации.

sniper21 ★★★★★ ()
Ответ на: комментарий от sniper21

кортеж после создания можно заполнить один раз и сделать это в другом месте - не обязательно при инициализации.

Tuples are immutable sequences, typically used to store collections of heterogeneous data

immutable - An object with a fixed value. Immutable objects include numbers, strings and tuples. Such an object cannot be altered. A new object has to be created if a different value has to be stored

Насколько я не понимаю пистон, переменная в нём это именованный объект в памяти, и я не совсем представляю, как получить «абстрактную» переменную без привязанного к ней конктретного объекта.

infine ()