gpt4 book ai didi

python - 使用 python mysql 连接器出现位置错误

转载 作者:行者123 更新时间:2023-11-29 15:36:25 26 4
gpt4 key购买 nike

我在尝试填充数据库时,使用 Python mysql 连接器遇到了数百个位置错误。我认为这是因为我无法转义部分或全部特殊字符。有没有办法转义导致此问题的所有特殊字符或者; ...我是否应该继续将每个字符串中的特殊字符替换为其他中性字符,并创建一个字典,以便当我从数据库中提取数据时将句子重新构造回原始状态?

for thing in every_thing:
line_= thing.split("|", 3)
book_name = line_[0]
chap_number = line_[1]
verse_num = line_[2]
verse= line_[3]
#Test
statement = "INSERT INTO " + new_dict[line_[0]]
statement += " ( "
chapters = book_key_chapt[line_[0]]
h = 1
fields = ""
while h <= chapters:
fields += "Chapter_" + str(h)
h += 1
if h != chapters + 1:
fields += ","
else:
fields += " )"
statement += fields
# Value creation
values = " VALUES ( "
a = 1
while a <= chapters:
if a == int(chap_number):
values += "'" + verse_num + verse.replace('~'," ") + "'"
else:
values += "'NA'"
a += 1
if a != chapters + 1:
values += ","
values += " )"
statement += values
try:
cur.execute(*statement)
print(cur)
except Exception as er:
print(er)

最佳答案

这里:

cur.execute(*statement)

“*”表示"unpack before passing" 。它通常应用于列表或元组,但适用于任何可迭代 - 并且字符串可迭代的。基本上,您在这里所做的是:

cur.execute(statemement[0], statement[1], statement[2], # etc)

因此我们知道您的 statement 字符串长度为 844 个字符;-)

解决方案当然是删除“*”。

话虽这么说,您的代码是 totally unsafe ,即使没有人利用这个漏洞来攻击你,它仍然非常脆弱(正确转义字符串并不是那么简单)。使用 db-api 的正确方法是 use placeholders in the SQL query and pass the values as arguments

请注意,这仅适用于,而不适用于表和字段名称,因此您仍然需要以编程方式构建 SQL 查询,但您可以使您的生活变得更轻松(并且您的代码会稍微更快)通过使用字符串格式化操作,并使用 str.join(seq) 构建字段列表和占位符列表,即:

statement = "INSERT INTO {table_name} ({fields}) VALUES ({placeholders})"

# NB: you may want to read about the stdlib's `csv` package...
book_name, chap_number, verse_num, verse = thing.split("|", 3)

table_name = new_dict[book_name]
nb_chapters = book_key_chapt[book_name]

fields = ["Chapter_{}".format(i) for i in range(1, nb_chapters + 1)]
placeholders = ["?"] * nb_chapters

values = [#XXX I let you rewrite your code here using a list comprehension as above]

sql = statement.format(
table_name=table_name,
fields=", ".join(fields),
placeholders=", ".join(placeholders)
)

cur.execute(sql, values)

最后(但很重要!)注意:看起来每个书名都有一个不同的表,每个表都有与章节一样多的字段?如果是的话,这是一个完全错误的设计。如果重点是对一本书+章节进行建模,您需要一个用于书籍的单个表(每本书一条记录),以及一个相关的“章节”表,在“书籍”表上有一个外键(每章一条记录)。

关于python - 使用 python mysql 连接器出现位置错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58205251/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com