web-dev-qa-db-fra.com

lire un script sql externe dans python

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()
37
mpg

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.

74
Azeirah