Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

MySQL Python connector error while inserting

So I am trying to build a database in MySQL using python. I already created the database and created the table I want to use. it’s called ‘alliances‘.

Now this table only has two columns, an ID column and a alliance_name column.
The ID’s auto increment , and the names I already have them as a list and would like to insert them into the table one by one. but it gives me an error:

ProgrammingError: 1054 (42S22): Unknown column 'alliance' in 'field list'

this is my code :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

import mysql.connector

db = mysql.connector.connect(host = "localhost", user = "root", password = "#########", database = 'WANHUI')

mycursor = db.cursor()

# mycursor.execute("CREATE DATABASE WANHUI")  we already added to the db

# mycursor.execute("CREATE TABLE alliances (ID INT PRIMARY KEY AUTO_INCREMENT, alliance_name VARCHAR(100) NOT NULL) ")

mini_list = alliance_list[:30]   # we only need the first 30

for alliance in mini_list: 
    mycursor.execute("INSERT INTO alliances (alliance_name) VALUES (alliance)")
    db.commit()

Why does it say no ‘alliance’ column if i do specify in the query to insert into the alliance_name
and that ‘alliance’ is the string that I wish to insert ??

EDIT:
I already tried this version:

for alliance in mini_list: 
    mycursor.execute("INSERT INTO alliances (alliance_name) VALUES (%s)", (alliance))
    db.commit()

But it gives me this error:

ProgrammingError: Could not process parameters: str(Iron Brotherhood Alliance), it must be of type list, tuple or dict

and even if I do :

mycursor.execute("INSERT INTO alliances (alliance_name) VALUES (%s)", (mini_list))
db.commit()

it would give me this :

ProgrammingError: Not all parameters were used in the SQL statement

>Solution :

Just parametrize your query like this:

for alliance in mini_list: 
    mycursor.execute("INSERT INTO alliances (alliance_name) VALUES (%s)", alliance)
    db.commit()

Then you can go further and make a batch insert with one query, by prebuilding its statement string, instead of executing multiple calls to your database.
Let’s assume your mini_list is equal to something like this: ["aa", "bb", "cc"].

# You get a string "('aa'), ('bb'), ('cc')" here for `VALUES` part of your SQL query:
alliances = ", ".join(f"('{alliance}')" for alliance in mini_list)


# Now use the string `alliances` to build a query:
mycursor.execute(f"INSERT INTO alliances (alliance_name) VALUES {alliances}")
db.commit()

This will produce SQL: INSERT INTO alliances (alliance_name) VALUES ('aa'), ('bb'), ('cc') and will allow you to insert all alliances at once.

Another way and the easier one to achieve the same result is to use cursor.executemany(), that will produce the same query:

cursor.executemany("INSERT INTO alliances (alliance_name) VALUES (%s)",
                   [(alliance, ) for alliance in mini_list])
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading