web-dev-qa-db-ja.com

pythonでの外部SQLスクリプトの読み取り

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

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

次に、テーブルから実行する一連のクエリがあります。以下のクエリは、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()
37
mpg

コードには、指定された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

他にご質問がある場合は、ご連絡ください。

74
Azeirah