运行Python database.py连接MySQL报1049未知数据库错误求解决方案
问题排查及修复方案
- 错误1:混淆了MySQL与SQLite的数据库使用逻辑
MySQL是服务型数据库,数据库由服务端统一管理,没有.db后缀的本地文件,你代码里填写的Prototype.db是SQLite这类文件型数据库的命名习惯,不适用于MySQL。同时你在连接前没有预先在MySQL中创建对应数据库,直接指定不存在的库名连接必然触发1049报错。 - 错误2:建表SQL语法缺失右括号
你写的建表语句末尾少了闭合的),即便数据库连接成功,执行到此处也会触发语法报错。 - 额外注意:MySQL在Linux环境下默认对库名、表名大小写敏感,Windows下默认不敏感,你的报错里显示找不到的是全小写的
prototype.db,就是系统自动转小写后匹配不到导致的。
修复步骤
- 去掉数据库名的
.db后缀,建议统一用小写命名,比如改为prototype - 调整连接逻辑:先不指定database连接MySQL,先执行建库语句,再切换到对应库,避免预先手动建库的操作
- 补全建表语句的右括号,同时将查询逻辑改为参数化写法,避免SQL注入风险
修正后的完整代码如下:
import mysql.connector # 先无库连接,创建数据库(如果不存在) MyDB = mysql.connector.connect( host = "localhost", user = "root", password = "" ) MyCursor = MyDB.cursor() # 创建数据库 MyCursor.execute("CREATE DATABASE IF NOT EXISTS prototype") # 切换到目标数据库 MyCursor.execute("USE prototype") # 补全建表语句的右括号 MyCursor.execute("CREATE TABLE IF NOT EXISTS Images (id INTEGER(45) NOT NULL AUTO_INCREMENT PRIMARY KEY, Photo BLOB NOT NULL)") def InsertBlob(FilePath): with open(FilePath, "rb") as File: BinaryData = File.read() SQLStatement = "INSERT INTO Images (Photo) VALUES (%s)" MyCursor.execute(SQLStatement, (BinaryData, ) ) MyDB.commit() def RetrieveBlob(ID): SQLStatement2 = "SELECT * FROM Images WHERE id = %s" # 用参数化查询避免注入风险 MyCursor.execute(SQLStatement2, (ID,)) MyResult = MyCursor.fetchone()[1] StoreFilePath = "IMG/img{0}.jpg".format(str(ID)) print(MyResult) with open(StoreFilePath, "wb") as File: File.write(MyResult) print("1. Insert Image\n2. Read Image") MenuInput = input() if int(MenuInput) ==1: UserFilePath = input("Enter File Path:") InsertBlob(UserFilePath) elif int(MenuInput) ==2: UserIDChoice = input("Enter ID:") RetrieveBlob(UserIDChoice)
内容的提问来源于stack exchange,提问作者Dancun Gerald
相关产品推荐
相关产品推荐

