J'utilise généralement Django pour me plonger pleinement dans les avantages du mappeur O / R, donc si je ne suis pas bon dans ce domaine Opérations sur les données qui peuvent être effectuées sans même écrire des instructions SQL dans une table qui n'a rien à voir avec Django Pouvez-vous dire "Monsieur, oui monsieur!" Lorsqu'on lui a demandé d'essayer? Je ne pouvais pas! Ensuite, j'ai fait de mon mieux donc je vais le résumer! L'article de Qiita commence!
Pour être honnête, ce que vous faites ne change pas beaucoup dans aucune langue, donc si vous vous en souvenez, vous pouvez également l'appliquer dans d'autres langues. Je pense que cela va fonctionner.
Si vous utilisez Django, vous avez un connecteur MySQL, non? Très bien, à côté! (J'aime lequel est le meilleur, alors je l'omets) Pour le moment, cet article concerne MySQL-python 1.2.5.
>>> import MySQLdb
>>>> conn = MySQLdb.connect(host='hoge_host', user='hoge_user', passwd='hogehoge', db='hoge1')
Faisons une connexion pour le moment! MySQLdb a connection () et connect (), mais il utilise connect (). la raison est,
>>> conn = MySQLdb.connection(host='hoge_host', user='hoge_user', passwd='hogehoge', db='hoge1')
>>> print type(conn)
<type '_mysql.connection'>
>>> conn = MySQLdb.connect(host='hoge_host', user='hoge_user', passwd='hogehoge', db='hoge1')
>>> print type(conn)
<class 'MySQLdb.connections.Connection'>
Oui, tu comprends? Si vous vous connectez avec connection (), _mysql.connection sera Un objet MySQLdb.connections.Connection a été créé lors de la connexion avec connect ().
La classe _mysql est encapsulée dans la classe de base de MySQLdb et la fonction est ajoutée à MySQLdb. Puisque le curseur est implémenté dans MySQLdb, connect () est une option à utiliser pour la connexion. Soyez prudent car c'est un point addictif ici! (Bien que j'utilise connect (), il existe de nombreux échantillons de trap où le nom de la variable est connection!)
Si vous pouvez vous connecter, essayons l'instruction SELECT dès que possible. Après cela, j'écrirai en supposant qu'il existe un objet conn connecté.
cursor = conn.cursor()
try:
cursor.execute('select * from hoge_table where id=1')
result = cursor.fetchall()
finally:
cursor.close()
conn.close()
Qu'est-ce qu'un curseur? Un concept qui ne peut être dit en un seul mot. Vraiment un concept. Certaines personnes expliquent qu'il s'agit d'une zone virtuelle pour effectuer séquentiellement plusieurs opérations sur la base de données. Pensez-y comme ça. Si vous voulez bien le connaître, allez à la mer sur le net! Vous pouvez lancer SQL avec conn.query ('select ~') sans l'utiliser, Puisqu'il n'est pas possible d'exécuter des transactions pour plusieurs opérations, il est courant d'utiliser des curseurs pour les opérations DB.
En outre, l'instruction SQL ne peut pas être récupérée en tant qu'objet simplement en la générant, mais en tant que jeu de résultats. Vous devez l'obtenir. Ce sera curseur.fetchall (). Il y a aussi fetchone () et fetchmany (), mais je pense que vous pouvez les utiliser correctement si nécessaire.
Les données récupérées sont, par exemple, un tableau hoge_table
id | name | hoge |
---|---|---|
1 | hogee | C'est hoge |
2 | hogege | C'est hoge? |
alors,
cursor.execute('select * from hoge_table')
result = cursor.fetchall()
Si vous prenez (grossièrement omis), le contenu du résultat est
((1, 'hogee', 'C'est hoge'), (2, 'hogege', 'C'est hoge?'))
Ce sera. e? Quel est le nom de la colonne? Vous pourriez avoir pensé, ** C'est doux ** Merci à O / R Mapper et préparez votre propre liste de noms de colonnes.
Enfin, la clause finally libère le curseur et la connexion, ** Bukkake avec clause ** Cependant, il n'y a aucune perte à le connaître en tant que méthode. Dans d'autres langues, je dois l'écrire moi-même. ~~ Eh bien, ça ne casse pas tellement même si je ne le relâche pas! ~~ Il est du devoir du programmeur de libérer rapidement des ressources précieuses
Mettons à jour ensuite. Ne serait-il pas pratique de faire des mises à jour par lots avec le traitement par lots des scripts Python?
conn = MySQLdb.connect(host='hoge_host', user='hoge_user', passwd='hogehoge', db='hoge1')
conn.autocommit(False)
cursor = conn.cursor()
try:
cursor.execute('update hoge_table set hoge="C'est hoge!" where id=1')
cursor.execute('select * from hoge_table')
result = cursor.fetchall()
conn.commit()
except Exception as e:
conn.rollback()
raise e
finally:
cursor.close()
conn.close()
Dans la deuxième ligne, la validation automatique est définie sur False, mais c'est certainement la valeur par défaut False, il n'est donc pas nécessaire de dire que c'est inutile. Eh bien, cela peut dépendre du connecteur, il est donc plus sûr de le définir explicitement sur False. Si vous le définissez sur True, il s'engagera sans autorisation (c'est vrai). Si False, appelez commit () vous-même. Nous appelons également rollback () nous-mêmes. Il est plus sûr de consacrer autant de temps et d'efforts si vous pouvez le faire dans les coulisses.
L'instruction SELECT est émise sur la ligne suivant l'instruction UPDATE, mais cela peut être la validation du résultat de la mise à jour. Vous pouvez le faire avec ça! Ceci est un exemple. Si vous n'aimez pas le résultat, faites une exception et faites-la revenir en arrière. Puisque cette zone ne peut pas être créée sans utiliser un curseur, connect () est toujours une option. Cela se reflète dans la base de données en appelant la fonction commit ().
C'est tout pour cette fois. Avec cela, tout à coup opération DB sans mappeur O / R Même si une tâche arrive, nous serons en mesure de la gérer. De plus, le fait que le framework agisse généralement en votre nom est également une question de contenu. Je pense que le savoir aidera à mieux comprendre.
"Attendez une minute! Il n'y a ni INSERT ni DELETE"
Ce qu'il faut faire n'est pas très différent de UPDATE, donc il est omis
"Attendez une minute! Il n'y a pas d'ALTER"
Besoin de le faire avec un script?
Recommended Posts