69

私はPythonでSQLを実行する方法の学習に取り組んでいます(PythonではなくSQLを知っています)。

外部SQLファイルがあります。'Zookeeper'、'Handles'、'Animal' の 3 つのテーブルにデータを作成して挿入します。

次に、テーブルから実行する一連のクエリがあります。以下のクエリは、python スクリプトの先頭にロードする Zookeeper.sql ファイルにあります。最初の 2 つの例は次のとおりです。

--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;

これらはすべて SQL で正常に実行されます。次に、Python 内からそれらを実行する必要があります。ファイルを読み取るためのコードが与えられ、完成しました。次に、ループ内のすべてのクエリを実行します。

1.1 と 1.2 は、私が混乱している場所です。私はループを信じています。これは、最初と2番目のクエリを実行するために何かを入れる必要がある行です。

result = c.execute("SELECT * FROM %s;" % テーブル);

でも何?非常に明白な何かが欠けていると思います。私を悩ませているのは % テーブルだと思います。クエリ 1.1 と 1.2 では、テーブルを作成するのではなく、クエリの結果を探しています。

私のpythonコード全体は以下の通りです。

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()
4

4 に答える 4

136

コードには、指定された sql ファイルからすべてのステートメントを実行する美しい方法が既に含まれています

# 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)

これを関数にラップすると、再利用できます。

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)

使用するには

executeScriptsFromFile('zookeeper.sql')

あなたは混乱したと言った

result = c.execute("SELECT * FROM %s;" % table);

Python では、文字列フォーマットと呼ばれるものを使用して、文字列に何かを追加できます。

%sを含む文字列があり"Some string with %s"ます。これは別のプレースホルダーです。プレースホルダーを置き換えるには、文字列の後に % (「置き換えたいもの」) を追加します

元:

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

少し幼稚な例ですが、明確にする必要があります。

それで

result = c.execute("SELECT * FROM %s;" % table);

つまり、 %s をテーブル変数の値に置き換えます。

(で作成)

for table in ['ZooKeeper', 'Animal', 'Handles']:


# for loop example

for fruit in ["apple", "pear", "orange"]:
    print(fruit)
>>> apple
>>> pear
>>> orange

さらに質問がある場合は、私をつついてください。

于 2013-10-20T02:12:57.100 に答える