Je suis en train d'apprendre comment exécuter SQL dans python (je connais SQL, pas Python).
J'ai un fichier SQL externe. Il crée et insère des données dans trois tables 'Zookeeper', 'Handles', 'Animal'.
Ensuite, j'ai une série de requêtes à exécuter à partir des tables. Les requêtes ci-dessous se trouvent dans le fichier zookeeper.sql que je charge en haut du script python. Exemple pour les deux premiers:
--1.1
SELECT ANAME,zookeepid
FROM ANIMAL, HANDLES
WHERE AID=ANIMALID;
- 1.2
SELECT ZNAME, SUM(TIMETOFEED)
FROM ZOOKEEPER, ANIMAL, HANDLES
WHERE AID=ANIMALID AND ZOOKEEPID=ZID
GROUP BY zookeeper.zname;
Tout cela fonctionne bien en SQL. Maintenant, je dois les exécuter depuis Python. J'ai reçu et complété le code à lire dans le fichier. Ensuite, exécutez toutes les requêtes de la boucle.
Les 1.1 et 1.2 sont la source de ma confusion. Je crois que dans la boucle, c'est la ligne où je devrais mettre quelque chose pour lancer la première, puis la deuxième requête.
result = c.execute ("SELECT * FROM% s;" table%);
mais quoi? Je pense que je manque quelque chose de très évident. Je pense que ce qui me rejette, c'est% table. Dans les requêtes 1.1 et 1.2, je ne crée pas de table, mais cherche un résultat de requête.
Tout mon python est ci-dessous.
import sqlite3
from sqlite3 import OperationalError
conn = sqlite3.connect('csc455_HW3.db')
c = conn.cursor()
# Open and read the file as a single buffer
fd = open('ZooDatabase.sql', 'r')
sqlFile = fd.read()
fd.close()
# all SQL commands (split on ';')
sqlCommands = sqlFile.split(';')
# Execute every command from the input file
for command in sqlCommands:
# This will skip and report errors
# For example, if the tables do not yet exist, this will skip over
# the DROP TABLE commands
try:
c.execute(command)
except OperationalError, msg:
print "Command skipped: ", msg
# For each of the 3 tables, query the database and print the contents
for table in ['ZooKeeper', 'Animal', 'Handles']:
**# Plug in the name of the table into SELECT * query
result = c.execute("SELECT * FROM %s;" % table);**
# Get all rows.
rows = result.fetchall();
# \n represents an end-of-line
print "\n--- TABLE ", table, "\n"
# This will print the name of the columns, padding each name up
# to 22 characters. Note that comma at the end prevents new lines
for desc in result.description:
print desc[0].rjust(22, ' '),
# End the line with column names
print ""
for row in rows:
for value in row:
# Print each value, padding it up with ' ' to 22 characters on the right
print str(value).rjust(22, ' '),
# End the values from the row
print ""
c.close()
conn.close()
Votre code contient déjà un excellent moyen d'exécuter toutes les instructions d'un fichier SQL spécifié
# Open and read the file as a single buffer
fd = open('ZooDatabase.sql', 'r')
sqlFile = fd.read()
fd.close()
# all SQL commands (split on ';')
sqlCommands = sqlFile.split(';')
# Execute every command from the input file
for command in sqlCommands:
# This will skip and report errors
# For example, if the tables do not yet exist, this will skip over
# the DROP TABLE commands
try:
c.execute(command)
except OperationalError, msg:
print "Command skipped: ", msg
Enroulez-le dans une fonction et vous pourrez le réutiliser.
def executeScriptsFromFile(filename):
# Open and read the file as a single buffer
fd = open(filename, 'r')
sqlFile = fd.read()
fd.close()
# all SQL commands (split on ';')
sqlCommands = sqlFile.split(';')
# Execute every command from the input file
for command in sqlCommands:
# This will skip and report errors
# For example, if the tables do not yet exist, this will skip over
# the DROP TABLE commands
try:
c.execute(command)
except OperationalError, msg:
print "Command skipped: ", msg
Pour l'utiliser
executeScriptsFromFile('zookeeper.sql')
Vous avez dit que vous avez été confus par
result = c.execute("SELECT * FROM %s;" % table);
En Python, vous pouvez ajouter des éléments à une chaîne en utilisant quelque chose appelé formatage de chaîne.
Vous avez une chaîne "Some string with %s"
avec% s, c’est un espace réservé pour autre chose. Pour remplacer l’espace réservé, ajoutez% ("avec quoi vous voulez le remplacer") après votre chaîne
ex:
a = "Hi, my name is %s and I have a %s hat" % ("Azeirah", "cool")
print(a)
>>> Hi, my name is Azeirah and I have a Cool hat
Un exemple enfantin, mais cela devrait être clair.
Maintenant quoi
result = c.execute("SELECT * FROM %s;" % table);
signifie, est-ce qu'il remplace% s par la valeur de la variable de table.
(créé en)
for table in ['ZooKeeper', 'Animal', 'Handles']:
# for loop example
for fruit in ["Apple", "pear", "orange"]:
print fruit
>>> Apple
>>> pear
>>> orange
Si vous avez des questions supplémentaires, piquez-moi.