[英]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.