I want the user to be able to update values to the database but i want to function to work the same way even if the record doesnt exist in database yet. So i would like to combine INSERT and UPDATE. I was thinking of doing a for loop for the records in the database to see if the record exist and then do an IF statement to decide if i should INSERT or UPDATE. I guess this would work everytime but the first time. If no records exists in the database this doesnt seem to work and i guess thats because i = none when the database is empty.
Example:
conn = sqlite3.connect("database.db")
c = conn.cursor()
c.execute("SELECT *, oid FROM database")
schemalaggning = c.fetchall()
conn.commit()
conn.close()
for i in schemalaggning:
if clicked1.get() and clicked2.get() and clicked10.get() in i:
myUPDATEfunction()
else:
myINSERTfunction2()
How can i solve this problem?
My specific code:
conn = sqlite3.connect("schemalaggning.db")
c = conn.cursor()
c.execute("SELECT *, oid FROM schemalaggning")
schemalaggning = c.fetchall()
conn.commit()
conn.close()
for i in schemalaggning:
if clicked1.get() and clicked2.get() and clicked10.get() in i:
conn = sqlite3.connect("schemalaggning.db")
c = conn.cursor()
c.execute("""UPDATE schemalaggning SET
namn = :namn,
ar = :ar,
vecka = :vecka,
mandag = :mandag,
tisdag = :tisdag,
onsdag = :onsdag,
torsdag = :torsdag,
fredag = :fredag,
lordag = :lordag,
sondag = :sondag
WHERE oid = :oid""",
{
"namn": clicked10.get(),
"ar": clicked1.get(),
"vecka": clicked2.get(),
"mandag": clicked3.get(),
"tisdag": clicked4.get(),
"onsdag": clicked5.get(),
"torsdag": clicked6.get(),
"fredag": clicked7.get(),
"lordag": clicked8.get(),
"sondag": clicked9.get(),
"oid": i[10]
})
conn.commit()
conn.close()
else:
pass
conn = sqlite3.connect("schemalaggning.db")
c = conn.cursor()
c.execute("INSERT INTO schemalaggning VALUES (:namn, :ar, :vecka, :mandag, :tisdag, :onsdag, :torsdag, :fredag, :lordag, :sondag)",
{
"namn": clicked10.get(),
"ar": clicked1.get(),
"vecka": clicked2.get(),
"mandag": clicked3.get(),
"tisdag": clicked4.get(),
"onsdag": clicked5.get(),
"torsdag": clicked6.get(),
"fredag": clicked7.get(),
"lordag": clicked8.get(),
"sondag": clicked9.get()
}
)
conn.commit()
conn.close()
I found a solution for my problem by adding this line before my for loop.
if len(schemalaggning) < 1:
addfunction
else:
for loop as above
from tkinter import *
import sqlite3
app = Tk()
app.geometry('1000x600')
def remove_one():
x = my_tree.selection()[0]
my_tree.delete(x)
conn = sqlite3.connect('CustomerRecords.db')
c = conn.cursor()
rowid = c.lastrowid
c.execute("DELETE from customers WHERE rowid = ", (rowid))
conn.commit()
conn.close()
remove_one_button = Button(button_frame, text = 'Remove Record', command= remove_one)
remove_one_button.grid(row =0, column=2, padx = 10, pady = 10)
app.mainloop()
output:
sqlite3.OperationalError: incomplete input
I want to be able to delete a row from sqlite3 database using the row id that is naturally assigned to each row
The DELETE SQL statement is obviously incomplete, it should be:
c.execute("DELETE from customers WHERE rowid = ?", (rowid,))
How to get the rowid? If you insert those records into my_tree like below:
conn = sqlite3.connect('CustomerRecords.db')
c = conn.cursor()
c.execute('SELECT rowid, * FROM customers')
for row in c:
# use `iid` option to store the rowid
my_tree.insert('', 'end', iid=row[0], values=row[1:])
conn.close()
Then you can use my_tree.selection()[0] (you already did it in remove_one()) to get the rowid of the selected row.
Below is the modified remove_one():
def remove_one():
selected = my_tree.selection()
if selected:
rowid = selected[0]
my_tree.delete(rowid)
conn = sqlite3.connect('CustomerRecords.db')
c = conn.cursor()
c.execute("DELETE from customers WHERE rowid = ?", (rowid,))
conn.commit()
conn.close()
else:
print("No record selected")
I'm trying to get my code to work but I keep getting this error.
File "C:\Users\mikae\Desktop\Sem 9\CSE115\Assignment 2\Actual\A2
(Version 5).py", line 186, in main
print_table_bookings(conn,booking_data[i])
IndexError: list index out of range
Currently, this is my code.
I'm not done with it, but I'm trying to write out two queries:
Find all the bookings of a specific trainer
Find the gender of the trainer for a type of training.
I've tried a lot of variations but I just can't get the logic down. I would appreciate feedback and any help that I can get.
Code
import sqlite3
from sqlite3 import Error
import os
# Create a connection to the SQLite database via DB file.
def create_connection(db_file):
"""create a database connection to the SQLite database
specified by db_file
:param db_file:database file
:return:Connection object or None
"""
conn = None
try:
conn = sqlite3.connect(db_file)
return conn
except Error as e:
print(e)
return conn
# Create tables from SQL statement
def create_table(conn,create_table_sql):
"""create a table from the create_table_sql statement
:param conn:Connection object
:param create_table_sql:a CREATE TABLE statement
:return:
"""
try:
c = conn.cursor()
c.execute(create_table_sql)
except Error as e:
print(e)
# Bookings Table
def print_table_bookings(conn, bookings):
sql=""" INSERT INTO bookings (booking_id,trainer_id,training_id,session_date,session_slot)
VALUES (?,?,?,?,?)"""
c = conn.cursor()
c.execute(sql,bookings)
conn.commit()
return c.lastrowid
# Trainers Table
def print_table_trainers(conn, trainers):
sql=""" INSERT INTO trainers (trainer_id,name,gender,mobile,specialisation,rate)
VALUES (?,?,?,?,?,?)"""
c = conn.cursor()
c.execute(sql,trainers)
conn.commit()
return c.lastrowid
# Trainings Table
def print_table_trainings(conn, trainings):
sql=""" INSERT INTO trainings (training_id,description,duration)
VALUES (?,?,?)"""
c=conn.cursor()
c.execute(sql,trainings)
conn.commit()
return c.lastrowid
# Print Tables
# Print Bookings
def display_bookings(conn):
c=conn.cursor()
c.execute("SELECT * FROM bookings")
rows=c.fetchall()
for row in rows:
print(row)
print("\n")
# Print Bookings
def display_trainers(conn):
c=conn.cursor()
c.execute("SELECT * FROM trainers")
rows=c.fetchall()
for row in rows:
print(row)
print("\n")
# Print Bookings
def display_trainings(conn):
c=conn.cursor()
c.execute("SELECT * FROM trainings")
rows=c.fetchall()
for row in rows:
print(row)
print("\n")
# Query to display Trainer's bookings by Trainer's Name
# NOT DONE
# Main Code
def main():
database = os.path.abspath(os.getcwd()) + "\healthhub.db"
# Create Bookings Table
sql_create_bookings_table = """CREATE TABLE IF NOT EXISTS bookings (
booking_id INTEGER PRIMARY KEY,
trainer_id INTEGER NOT NULL,
training_id TEXT,
session_date INTEGER NOT NULL,
session_slot TEXT NOT NULL,
FOREIGN KEY(trainer_id) REFERENCES trainer(id),
FOREIGN KEY(training_id) REFERENCES training(id)
);"""
# Create Trainer Table
sql_create_trainers_table = """CREATE TABLE IF NOT EXISTS trainers (
trainer_id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
gender TEXT NOT NULL,
mobile TEXT NOT NULL,
specialisation TEXT NOT NULL,
rate INTEGER NOT NULL
);"""
# Create Trainings Table
sql_create_trainings_table = """CREATE TABLE IF NOT EXISTS trainings (
training_id INTEGER PRIMARY KEY,
description TEXT NOT NULL,
duration INTEGER NOT NULL
);"""
# Create a Database(DB) Connection
conn = create_connection(database)
# Create Tables using def above
if conn is not None:
create_table(conn,sql_create_bookings_table)
create_table(conn,sql_create_trainers_table)
create_table(conn,sql_create_trainings_table)
with conn:
# Error prevention
c=conn.cursor()
c.execute("DELETE FROM bookings;");
c.execute("DELETE FROM trainers;");
c.execute("DELETE FROM trainings;");
# Populating the tables
# Bookings table
booking_1 = (101,'001','0001','01082021','Morning')
booking_2 = (102,'001','0001','01082021','Morning')
booking_3 = (103,'001','0001','01082021','Morning')
booking_4 = (104,'001','0001','01082021','Morning')
booking_5 = (105,'001','0001','01082021','Morning')
booking_6 = (106,'001','0001','01082021','Morning')
booking_7 = (107,'001','0001','01082021','Morning')
booking_8 = (108,'001','0001','01082021','Morning')
booking_9 = (109,'001','0001','01082021','Morning')
booking_10 = (110,'001','0001','01082021','Morning')
# Trainers Table
trainer_1 = (2021,'Gary','Male','91234567','Weight Loss','85')
trainer_2 = (2022,'Bary','Male','91234568','Weight Loss','185')
trainer_3 = (2023,'Mary','Female','91234569','Weight Loss','85')
trainer_4 = (2024,'Stephanie','Female','91234570','Weight Loss','85')
trainer_5 = (2025,'Austin','Male','91234571','Weight Loss','65')
trainer_6 = (2026,'Tynia','Female','91234572','Weight Loss','85')
trainer_7 = (2027,'Oswald','Male','91234573','Weight Loss','55')
trainer_8 = (2028,'Aria','Female','91234574','Weight Loss','45')
trainer_9 = (2029,'Micheal','Male','91234575','Weight Loss','95')
trainer_10 = (2030,'Lily','Female','91234576','Weight Loss','105')
#trainings table
trainings_1 = (3031,'Weight Loss','90')
trainings_2 = (3032,'Cardio','90')
trainings_3 = (3033,'Boxing','90')
trainings_4 = (3034,'Kickboxing','90')
trainings_5 = (3035,'Muay Thai','90')
trainings_6 = (3036,'Kettlebells','90')
trainings_7 = (3037,'Strength training','90')
trainings_8 = (3038,'Yoga','90')
trainings_9 = (3039,'Sparring','90')
trainings_10 = (3040,'Jiu-jitsu','90')
#Loop to write data into table
booking_data = [booking_1,booking_2,booking_3,booking_4,booking_5,booking_6,booking_7,booking_8,booking_9,booking_10]
trainer_data = [trainer_1,trainer_2,trainer_3,trainer_4,trainer_5,trainer_6,trainer_7,trainer_8,trainer_9,trainer_10]
training_data = [trainings_1,trainings_2,trainings_3,trainings_4,trainings_5,trainings_6,trainings_7,trainings_8,trainings_9,trainings_10]
i=0
while i < 20:
print_table_bookings(conn,booking_data[i])
print_table_trainers(conn,trainer_data[i])
print_table_trainings(conn,training_data[i])
i=i+1
#Displaying Table
print_table_bookings(conn)
print()
print_table_trainers(conn)
print()
print_table_trainings(conn)
print()
if __name__=='__main__':
main()
here:
booking_1 = (101,'001','0001','01082021','Morning')
...
booking_data = [booking_1,booking_2,booking_3,booking_4,booking_5,booking_6,booking_7,booking_8,booking_9,booking_10]
...
create_table(conn,booking_data[i])
the booking_data[i] will never be a string containing a SQL instruction. Here you probably want to transform this tuple into a INSERT statement before you execute it.
In main() after you create the tables, you are trying to insert new rows with this loop:
i=0
while i < 20:
create_table(conn,booking_data[i])
create_table(conn,trainer_data[i])
create_table(conn,training_data[i])
i=i+1
in which you use create_table() instead of print_table_bookings(), print_table_trainers() and print_table_trainings().
Change to this:
i=0
while i < 20:
print_table_bookings(conn,booking_data[i])
print_table_trainers(conn,trainer_data[i])
print_table_trainings(conn,training_data[i])
i=i+1
I've got a query that returns the data correctly in MySQL but in Python only returns part of the data.
The query is:
select sc.* from tbl030_shots_chart sc, tbl006_player_team tc where
sc.id_fiba = tc.id_player_feb and
tc.id_team_club = 5
This query in MySQL returns 1030 rows like you can see in this screen cap.
However, If I execute this query with python, I've got only 67 rows. This is my code:
connection = pymysql.connect(host = DDBB.DDBB_FIBA_HOST,
user = DDBB.DDBB_FIBA_USER,
password = DDBB.DDBB_FIBA_PSWD,
db = DDBB.DDBB_FIBA_NAME,
charset = DDBB.DDBB_FIBA_CHARSET,
cursorclass=pymysql.cursors.DictCursor)
with connection.cursor() as cursor:
totalRows = cursor.execute("select sc.* from tbl030_shots_chart sc, tbl006_player_team tc where sc.id_fiba = tc.id_player_feb and tc.id_team_club = %s", [5])
print("Total Rows: " + str(totalRows))
And this is the exit:
Why I've got les data from Python than MySQL?
These are the definition of the tables:
tbl030_shots_chart
tbl006_player_team
Edit I:
With inner join doesn't work in python but works in MySQL
However, with python, still returns 76 rows and not 1030 like MySQL.
connection = pymysql.connect(host = DDBB.DDBB_FIBA_HOST,
user = DDBB.DDBB_FIBA_USER,
password = DDBB.DDBB_FIBA_PSWD,
db = DDBB.DDBB_FIBA_NAME,
charset = DDBB.DDBB_FIBA_CHARSET,
cursorclass=pymysql.cursors.DictCursor)
with connection.cursor() as cursor:
totalRows = cursor.execute("select sc.* from tbl030_shots_chart as sc inner join tbl006_player_team as pt on sc.id_fiba = pt.id_player_feb and pt.id_team_club = %s", [5])
print("Total Rows: " + str(totalRows))
If I've got the total rows from the cursor with this code:
connection = pymysql.connect(host = DDBB.DDBB_FIBA_HOST,
user = DDBB.DDBB_FIBA_USER,
password = DDBB.DDBB_FIBA_PSWD,
db = DDBB.DDBB_FIBA_NAME,
charset = DDBB.DDBB_FIBA_CHARSET,
cursorclass=pymysql.cursors.DictCursor)
with connection.cursor() as cursor:
cursor.execute("select sc.* from tbl030_shots_chart as sc inner join tbl006_player_team as pt on sc.id_fiba = pt.id_player_feb and pt.id_team_club = %s", [5])
totalRows = cursor.rowcount
print("Total Rows: " + str(totalRows))
I've got 76 rows returned and not 1030.
You can try creating a view for this query.
CREATE VIEW your_view AS (
SELECT
t1.id,
t1.id_game,
t1.line,
...
t2.id_team_club,
t2.id_player_feb,
...
FROM tbl030_shots_chart t1
LEFT JOIN
tbl006_player_team t2
)
Then in your python code:
sql = 'SELECT * FROM your_view WHERE id_fiba =id_player_feb AND id_team_club = %s'
with connection.cursor() as cursor:
cursor.execute(sql, (5))
Try to use the cursor rowcount attribute:
with connection.cursor() as cursor:
cursor.execute("select sc.* from tbl030_shots_chart sc, tbl006_player_team tc where sc.id_fiba = tc.id_player_feb and tc.id_team_club = %s", [5])
totalRows=cursor.rowcount
print("Total Rows: " + str(totalRows))
In the .execute method there are no return values defined, so you can get anything.