繁体   English   中英

将 .txt 文件中的行读入 sql 查询

[英]Read lines from .txt file into sql query

我想通过 SQL 查询逐行运行 a.txt 文件。 .txt 文件包含数据库中可能存在或不存在的歌曲标题。 如果数据库中有多个适合歌曲标题的选项,则应出现一个选择菜单。 如果只有一个选项,则无需采取进一步行动。 如果 .txt 文件中的行不在数据库中,则应出现打印语句,说明未找到该歌曲。

为了对此进行测试,我使用上述三个选项中的每一个创建了一个.txt 文件:

Your (this gives 7 hits)
Bohemian (this gives 1 hit)
Thriller (this gives 0 hits)

我在另一个 .py 文件中创建了 .txt 文件,如下所示:

with open('MijnMuziek.txt', 'w') as f:
    f.writelines("""
                        your
                        bohemian
                        thriller""")
    f.close()

但是,如果我在单独的 .py 文件中运行下面的代码,它只会打印“从以下选项中选择:”,然后给出一条错误消息,指出索引超出范围。

import sqlite3

music_database = sqlite3.connect("C:\\Users\marlo\Downloads\chinook_LOI.db")
cursor = music_database.cursor()

def read_file(filename):
    with open(filename) as f:
        for track in f:
            cursor.execute(f"""SELECT DISTINCT t.TrackId, t.Name, art.Name
                               FROM tracks t
                               JOIN albums alb ON t.AlbumId = alb.AlbumId
                               JOIN artists art ON alb.ArtistId = art.ArtistId
                               WHERE t.Name LIKE '{track}%'""")
def selection_menu():
    for position, song in enumerate(tracks_available):
        print(str(position + 1), *song[1:3], sep='\t')
    choice = int(input('Choose from the following options: '))
    print('You chose:', *tracks_available[choice - 1], sep='\t')

read_file('MijnMuziek.txt')
tracks_available = cursor.fetchall()
selection_menu()
music_database.close()

当我在 .txt 文件 ( f.writelines('your') ) 中只放置一个选项时,代码确实有效并且我得到一个选择菜单。但是在 .txt 文件中有多个行时它不起作用。

我该如何解决这个问题?

我没有你的数据库来测试这个,但这是一种方法。

在读取 function 时打开和关闭数据库是有意义的。避免使用全局变量并将它们传递给函数也是一个好主意。

我在您的文本文件中包括了对空行的保护。

我没有为你修复 SQL 注入,因为我需要用谷歌搜索它如何与你使用的 LIKE % 一起工作......

import sqlite3

DATABASE_FILE = r"C:\\Users\marlo\Downloads\chinook_LOI.db"

def read_tracks_from_file(filename, database_file):
    music_database = sqlite3.connect(database_file)
    cursor = music_database.cursor()

    tracks_available = []
    with open(filename) as f:
        for track in f:
            if track:
                cursor.execute(f"""SELECT DISTINCT t.TrackId, t.Name, art.Name
                                   FROM tracks t
                                   JOIN albums alb ON t.AlbumId = alb.AlbumId
                                   JOIN artists art ON alb.ArtistId = art.ArtistId
                                   WHERE t.Name LIKE '{track}%'""")
                for track in cursor.fetchall():
                    tracks_available.append(track)

    music_database.close()
    return tracks_available

def selection_menu(track_selection):
    for position, song in enumerate(track_selection, start=1):
        print(str(position), *song[1:3], sep='\t')
    choice = int(input('Choose from the following options: '))
    print('You chose:', *track_selection[choice - 1], sep='\t')

tracks_available = read_tracks_from_file(filename='MijnMuziek.txt',
                                         database_file=DATABASE_FILE)
selection_menu(track_selection=tracks_available)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM