I have a problem with an insert in python. All the attributes are correct and it gives no errors. Here is my code:
db = MySQLdb.connect(host="localhost", user="root", passwd="", db="ueberwachung") #Datenbank connection
cur = db.cursor()
cur.execute("INSERT INTO tereignisse VALUES('1002', '2016-12-02','18:34:15','/var/www/html/videos/2016-11-0103:21:13', '0')")
cur.close()
db.close()
Edit: Sorry I forgot the problem. So problem: It doesn't write anything into the table.
You need to commit the transaction before closing the connection:
db.commit()
cur.close()
db.close()
Related
I am trying to update my mariadb table via python code .While compile the query nothing happen in my database. please check below code and let me know where i made mistake in update function
import mariadb
connection= mariadb.connect(user="user1", database="db1", host="ippp" ,password="pass")
cursor= connection.cursor()
cursor.execute("UPDATE product_options_combinations SET quantity=5944 WHERE item_code ='31628'")
cursor.close()
connection.close()
Hello here I have a clean code example for you. How to update it.
import pymysql
# Create a connection object
# IP address of the MySQL database server
Host = "localhost"
# User name of the database server
User = "user"
# Password for the database user
Password = ""
database = "GFG"
conn = pymysql.connect(host=Host, user=User, password=Password, database)
# Create a cursor object
cur = conn.cursor()
query = f"UPDATE PRODUCT SET price = 1400 WHERE PRODUCT_TYPE = 'broadband'"
cur.execute(query)
#To commit the changes
conn.commit()
conn.close()
You just need to add connection.commit() to your code, but I recommend you use a parametrized SQL preferably with a list of tuples,more of which might be added if needed, along with cursor.executemany() as being more performant for DML statements such as
import mariadb
connection= mariadb.connect(user="user1",
password="pass",
host="ippp",
port=3306,
database="db1")
cursor= connection.cursor()
dml="""
UPDATE product_options_combinations
SET quantity=%s
WHERE item_code =%s
"""
val=[
(5944,'31628')
]
cursor.executemany(dml,val)
connection.commit()
cursor.close()
connection.close()
Are you sure that the connection is working properly?
Have you tried to implement a try and catch routine to print mariadb errors?
Something like this:
# Connect to MariaDB Platform
import mariadb
try:
conn = mariadb.connect(
user="user",
password="password",
host="xx.xx.xx.xx",
port=3306,
database="db_name"
)
except mariadb.Error as e:
print(f"Error connecting to MariaDB Platform: {e}")
sys.exit(1)
I have already searched for several solutions here and tried to get a working code. Everything works except for the where query.
In the where query I search for the highest value (numeric). However, this does not really work...
Here is my code and the structure of the MySQL database.
Thanks!
import pymysql
conn = pymysql.connect(host='localhost', unix_socket='', user='root', passwd='pw', db='database')
cur = conn.cursor()
cur.execute("SELECT * FROM dose")
for r in cur:
curr = conn.cursor()
sql = """UPDATE dose
SET status = "printed"
WHERE id = SELECT GREATEST (status) FROM dose (status);"""
# print(sql)
try:
# Execute the SQL command
curr.execute(sql)
# Commit your changes in the database
conn.commit()
except:
# Rollback in case there is any error
conn.rollback()
curr.close()
cur.close()
conn.close()
My SQL Database
You have a lot of things wrong in your code.
You donĀ“t use the results of your first select query, and the only thing that you do is iterate over the results to execute an UPDATE
Your update query is wrong
You should change it to:
import pymysql
conn = pymysql.connect(host='localhost', unix_socket='', user='root', passwd='pw', db='database')
curr = conn.cursor()
sql = """UPDATE dose
SET status = 'printed'
WHERE id = (SELECT max(status) FROM dose) """
try:
# Execute the SQL command
curr.execute(sql)
# Commit your changes in the database
conn.commit()
except:
# Rollback in case there is any error
conn.rollback()
curr.close()
conn.close()
I have the following Python code in an AWS Lambda function, and I want the queries on an RDS Aurora DB to run atomically, that is, run all or run none. Will the conn.commit() statement do that for me? If not how can I accomplish this? conn is my DB connection object.
# Connect to the DB
conn = pymysql.connect(rds_host, user=username,
passwd=password, db=db_name,
connect_timeout=10)
# Run queries
with conn.cursor() as cur:
cur.execute("create table some_table_2020 like some_table;")
cur.execute("insert into some_table_2020 select * from some_table;")
cur.execute("rename table some_table to some_table_20200629;")
cur.execute("rename table some_table_2020 to some_table;")
conn.commit()
Thanks to kielni's comment, here's the answer, per Use Commit and Rollback to Manage MySQL Transactions in Python
# Connect to the DB
conn = pymysql.connect(rds_host, user=username,
passwd=password, db=db_name,
connect_timeout=10)
try:
# Run queries
with conn.cursor() as cur:
cur.execute("create table some_table_2020 like some_table;")
cur.execute("insert into some_table_2020 select * from some_table;")
cur.execute("rename table some_table to some_table_20200629;")
cur.execute("rename table some_table_2020 to some_table;")
conn.commit()
exception:
# Failed to commit changes in the DB, do rollback
conn.rollback()
finally:
#closing database connection.
if(conn.is_connected()):
cursor.close()
conn.close()
I want to use run below mysql script using with pymysql.
START TRANSACTION;
BEGIN;
insert into ~~~
COMMIT;
my python source code is
connection = pymysql.connect(~~~~~~~)
with connection.cursor() as cursor :
connection.begin()
cursor.execute(~~.sql)
connection.commit()
connection.close()
My question is "connection.begin()" is the same thing "START TRANSACTION; BEGIN;" ? I want to use "START TRANSACTION; BEGIN;"
According to the PyMySQL docs/example (singular...this doesn't seem like a very well-supported package), by default auto-commit is off, so you do need to run connection.commit() to actually finish the transaction.
Their example:
import pymysql.cursors
connection = pymysql.connect(host='localhost',
user='user',
password='passwd',
db='db',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor:
sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
cursor.execute(sql, ('webmaster#python.org', 'very-secret'))
# connection is not autocommit by default. So you must commit to save changes.
connection.commit()
finally:
connection.close()
pymysql.connections.Connection.begin
see manual for more info
db = MySQLdb.connect(host="xxx.xx.xx.x",
user="xxx",
passwd="xxx",
db="xxxx")
for loop on json data:
cursor = db.cursor()
cursor.execute('Insert Query')
db.commit()
db.close()
Would it be possible for me to improve this query? I'm considering doing multiple cursor.execute before db.commit()
I'm unsure how db.commit() works and the importance of it.
I'm basically looping a json data and inserting it with a loop. I cannot avoid having multiple inserts.
Depending on how json_data is structured you should be able to use .executemany():
db = MySQLdb.connect(host="xxx.xx.xx.x",
user="xxx",
passwd="xxx",
db="xxxx")
cursor = db.cursor()
cursor.executemany('Insert Query',json_data)
db.commit()
cursor.close()
db.close()