Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Class mysql python

+2 votes

Comment faire pour utiliser cette classe python trouver sur code-reivew: Je n'arrive pas faire des select. Je ne sais pas qu'elle sont les argument a passé... Je vous ai mit a la fin le how to use. J'ai un message d'erreur du type SyntaxError: non-keyword arg after keyword arg

class Mysql(object):

__instance = None

__host = None
__user = None
__password = None
__database = None

__session = None
__connection = None

def __new__(cls, *args, **kwargs):
    if not cls.__instance:
        cls.__instance = super(Mysql, cls).__new__(cls, *args, **kwargs)
    return cls.__instance

def __init__(self, host='localhost', user='root', password='', database=''):
    self.__host = host
    self.__user = user
    self.__password = password
    self.__database = database


#Open connection with database
def _open(self):
    try:
        cnx = mysql.connector.connect(host=self.__host, user=self.__user, password=self.__password,
                                      database=self.__database)
        self.__connection = cnx
        self.__session = cnx.cursor()
    except mysql.connector.Error as err:
        if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
            print 'Something is wrong with your user name or password'
        elif err.errno == errorcode.ER_BAD_DB_ERROR:
            print 'Database does not exists'
        else:
            print err

def _close(self):
    self.__session.close()
    self.__connection.close()

def insert(self, table, *args, **kwargs):
    values = None
    query = "INSERT INTO %s " % table
    if kwargs:
        keys = kwargs.keys()
        values = kwargs.values()
        query += "(" + ",".join(["`%s`"]*len(keys)) % tuple(keys) + ") VALUES(" + ",".join(["%s"]*len(values)) + ")"
    elif args:
        values = args
        query += " VALUES(" + ",".join(["%s"]*len(values)) + ")"
    self._open()
    self.__session.execute(query, values)
    self.__connection.commit()
    self._close()
    return self.__session.lastrowid

def select(self, table, where=None, *args):
    result = None
    query = "SELECT "
    keys = args
    l = len(keys) - 1
    for i, key in enumerate(keys):
        query += "`"+key+"`"
        if i < l:
            query += ","
    query += " FROM %s" % table
    if where:
        query += " WHERE %" % where
    self._open()
    self.__session.execute(query)
    self.__connection.commit()
    for result in self.__session.stored_results():
        result = result.fetchall()
    self._close()
    return result

def update(self, table, index, **kwargs):
    query = "UPDATE %s SET" % table
    keys = kwargs.keys()
    values = kwargs.values()
    l = len(keys) - 1
    for i, key in enumerate(keys):
        query += "`"+key+"`=%s"
        if i < l:
            query += ","
    query += " WHERE index=%d" % index
    self._open()
    self.__session.execute(query, values)
    self.__connection.commit()
    self._close()

def delete(self, table, index):
    query = "DELETE FROM %s WHERE uuid=%d" % (table, index)
    self._open()
    self.__session.execute(query)
    self.__connection.commit()
    self._close()

def call_store_procedure(self, name, *args):
    result_sp = None
    self._open()
    self.__session.callproc(name, args)
    self.__connection.commit()
    for result in self.__session.stored_results():
        result_sp = result.fetchall()
    self._close()
    return result_sp

from Mysql import Mysql
connection = Mysql(host='localhost', user='root', password='', database='test')
#Assuming that our table have the fields id and name in this order.
#we can use this way but the parameter should have the same order that table
#connection.insert('table_name',parameters to insert)
connection.insert('test',1, 'Alejandro Mora')
#in this case the order isn't matter
#connection.insert('table_name', field=Value to insert)
connection.insert('test',name='Alejandro Mora', id=1)
#connection.select('Table', where="conditional(optional)", field to returned)
connection.select('test', where="name = 'Alejandro Mora' ")
connection.select('test', None,'id','name')
demandé 9-Fev-2016 par Andronaute (150 points)

1 Réponse

+1 vote

Une version mise à jour du code que tu essaies d'utiliser est dispo ici.
Tu peux donc utiliser select() de cette façon:

select('test', where="name='Sam&Max'", bla, rebla, blablabla)

ce qui donne cette query:

SELECT `bla`,`rebla`,`blablabla` FROM test WHERE name='Sam&Max'

Dans ce cas ci, *args repésente les fields que tu veux SELECT.

répondu 9-Fev-2016 par barnumbirr (2,750 points)
edité 10-Fev-2016 par barnumbirr

nope ca ne marche pas aussi. Enfin chez moi non , Quand je regarde la method select, je comprend qu'on ne peut pas mettre un keyword arg avant des arg donc c'est normale que ca plante.

La j'ai trouvé une version encore diff: https://github.com/nestordeharo/mysql-python-class

Mais pareil j'ai un bug au niveau de la syntaxe SQL cet fois ci

Tu peux definir un kwarg car:

#connection.select('Table', where="conditional(optional)", fields to be returned)
#connection.select('test', where="name = 'Alejandro Mora' ")

Quand tu essayes un SELECT avec la syntaxe que je donne plus haut, quel est le message d'erreur?

C'est bon j'ai trouvé les erreurs dans la class en question. Je me suis basé sur la classe que l'on trouve sur Github celle que j'ai mise en lien

mySQL Gihub class

En fait il y a des problemes avec les ` qui sont manquant ici

 query += 'FROM %' % table

au lieu de ca

query += 'FROM `%s`' % table

Une fois cette modif de faite on peut faire ca :

conditional_query = 'car_make = %s '
result = connect_mysql.select('car', conditional_query, 'id_car', 'car_text', car_make='nissan')

Voila le msg d'erreur

SyntaxError: non-keyword arg after keyword arg

As tu essayé cette classe de ton coté avec une base mysql en local ?

Plutôt que d'utiliser ce système, utilise la lib peewee. C'est plus robuste et flexible.

Merci pour ton conseil, mais je reste un débutant en python, pewee est une étape encore loin pour moi pour de l'orm je crois

Au contraire, c'est bien plus facile que d'écrire tout ce code toi-même.

...