Возникли проблемы при создании новых таблиц в SQL с помощью кода python

#python #sql

#python #sql

Вопрос:

Я новичок в программировании после прохождения MOOC на python, и я начал возиться для практики. Я нашел интересный отрывок в Интернете и воспользовался им. Цель состоит в том, чтобы написать код, который вычисляет pi на основе случайных переменных x, y, которые находятся в диапазоне от 0 до 1. Я выполнил основную задачу, но затем захотел добавить немного ошибок и поэкспериментировать. Я решил сохранить данные в таблицах SQL и сделать код устойчивым к вычислению pi с большей точностью.

Теперь я получаю следующую трассировку при попытке запустить свой код.

 Traceback (most recent call last):
File "F:DesktopProgrammingpipisql.py", line 36, in <module>
num_point_circle=int(cur.fetchone()[0])
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
 

Мой код в целом:

 import random
import sys
import sqlite3

conn = sqlite3.connect('pi.sqlite')
cur = conn.cursor()

#creating tables for x and y and making sure x and y are unique
cur.execute('''CREATE TABLE IF NOT EXISTS X
(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, x_value REAL UNIQUE)''')

cur.execute('''CREATE TABLE IF NOT EXISTS Y
(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, y_value REAL UNIQUE)''')

cur.execute('''CREATE TABLE IF NOT EXISTS XY
(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,x_id INTEGER, y_id INTEGER, loc TEXT)''')

cur.execute('''CREATE TABLE IF NOT EXISTS Pi
(id INTEGER PRIMARY KEY, pi_value REAL, Accuracy FLOAT, parses INTEGER,
incircle INTEGER UNIQUE)''')
#accuracy here is the number of digits after 3 and .

cur.execute('''SELECT MAX(parses) OR NULL AS parses FROM Pi''')
parses=cur.fetchone()
runs=input('Enter number of points: ')
print('***Started calculating***')
n=int(runs)

#If it is the first time I run the code
if parses is None:
    num_point_circle=0
    num_point_total=0
    print('###STARTING FROM SCRATCH###')
else:
#To continue from last time
    cur.execute('''SELECT MAX(incircle) AS incircle FROM Pi''')
    num_point_circle=int(cur.fetchone()[0])
    cur.execute('''SELECT MAX(parses) AS parses FROM Pi''')
    num_point_total=int(cur.fetchone()[0])
    print('###CONTINUE FROM',num_point_total,'PARSES###')
try:
    for i in range (n):
        x=random.uniform(0,1)
        cur.execute('INSERT OR IGNORE INTO X (x_value) VALUES (?)',(x,))
        y=random.uniform(0,1)
        cur.execute('INSERT OR IGNORE INTO Y (y_value) VALUES (?)',(y,))


        distance = x**2   y**2
        if distance <=1:
            num_point_circle =1
            loc='Inside Circle'
            cur.execute('INSERT OR IGNORE INTO XY (x_id,y_id,loc) VALUES (?,?,?)',(x,y,loc))
        else:
            loc='Outside Circle'
            cur.execute('INSERT OR IGNORE INTO XY (x_id,y_id,loc) VALUES (?,?,?)',(x,y,loc))

        num_point_total =1

    p=4*num_point_circle/num_point_total
    accu=(len(str(p))-2)
    print('---->pi estimate for',num_point_total,'points is',p)
    cur.execute('INSERT OR IGNORE INTO Pi (pi_value,Accuracy,parses,incircle) VALUES (?,?,?,?)',(p,accu,num_point_total,num_point_circle),)
    print('Accuracy:',accu)
    print('!!!DO NOT CANCEL. PROCEEDING TO COMMIT ON TABLE!!!')
    conn.commit()
except KeyboardInterrupt:
    p=4*num_point_circle/num_point_total
    accu=(len(str(p))-2)
    print('---->pi estimate for',num_point_total,'points is',p)
    cur.execute('INSERT OR IGNORE INTO Pi (pi_value,Accuracy,parses,incircle) VALUES (?,?,?)',(p,accu,num_point_total,num_point_circle),)
    print('Accuracy:',accu)
    print('!!!DO NOT CANCEL. PROCEEDING TO COMMIT ON TABLE!!!')
    print("***User ended calculation***")
    conn.commit()
    sys.exit()
 

Есть идеи, что я могу изменить?
Заранее большое спасибо

Комментарии:

1. Вероятно, cur.fetchone()[0] равно None, и u не может привести к int a None . вы можете попытаться распечатать значение перед использованием, чтобы увидеть, что происходит.

2. Большое спасибо @Zartch. Я устал и не думал об этом. Проблема заключалась в том, что начальное значение, которое проверяла программа, было кортежем. изменил parses=cur.fetchone() на parses=cur.fetchone()[0] и теперь все работает нормально 🙂