Python 3 및 MySQL 커넥터의 유니코드 및 잘못된 인수 수 오류
파이썬 3의 MySQL(MariaDB) 데이터베이스에서 간단한 SELECT 쿼리를 실행하려고 합니다.
아주 이상한 오류가 발생하고 있습니다.
query = (
'SELECT user_id, user_password_hash, user_password_salt '
'FROM users '
'WHERE user_username = "%s"'
)
print(f'Trying login, username {username}, password {password}')
try:
cursor = self.connection.cursor(prepared=True)
cursor.execute(query, (username,))
results = cursor.fetchone()
print(results)
...
except Error as e:
print('Error in login query: ' + str(e))
raise e
이 코드를 실행하면 다음 오류가 발생합니다.Error in login query: 1210: Incorrect number of arguments executing prepared statement
저는 이해할 수 없습니다. 그것은 하나의 주장을 필요로 하고, 저는 그것에 대해 하나의 주장을 했습니다.의 튜플에서 쉼표 제거execute()
이 문제는 해결되지 않습니다.
이제 쿼리에서 인용문을 제거하면 완전히 다른 오류가 발생합니다.
query = (
'SELECT user_id, user_password_hash, user_password_salt '
'FROM users '
'WHERE user_username = %s'
)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9b in position 0: invalid start byte
The above exception was the direct cause of the following exception:
SystemError: <class 'UnicodeDecodeError'> returned a result with an error set
테이블은 utf8mb4를 사용하고 있으니 문제 없을 것 같습니다.
또한, 달리기SELECT * FROM users WHERE user_username="jeff"
MySQL 콘솔에서 정상적으로 작동합니다.
이것은 정말 사소한 질문이어야 하지만, 저는 무슨 일이 일어나고 있는지 전혀 모릅니다. 어떤 도움이라도 주시면 대단히 감사하겠습니다.
편집: 격리된 Python 프로세스에서 실험할 때 다음을 실행하여 문제를 재현했습니다.
import mysql.connector
conn = mysql.connector.connect(host="localhost",
database="lucidlab",
user="lucidlab",
password="lucidlab")
cur = conn.cursor()
cur.execute("SELECT * FROM users WHERE user_username='jeff'")
results = cur.fetchall() # ERROR
print(results)
이것은 아마도 데이터베이스 인코딩 문제일 것이라고 생각하게 만듭니다.
편집: 문제를 해결했습니다.아래의 제 답변을 참고하시기 바랍니다.
문제를 발견했습니다.수정하려면 스키마를 살펴봐야 하는데, 안타깝게도 학습 후에 학습하지 못했습니다.
내 스키마에는 다음이 포함되어 있습니다.
CREATE TABLE users (
...
user_password_hash BINARY(20) NOT NULL,
user_password_salt BINARY(20) NOT NULL,
...
);
실행 중SELECT * FROM users...
모든 종류의 쿼리는 이 이진 데이터를 검색하며, Python은 이 이진 데이터를 UTF-8 문자열로 즉시 변환합니다.소금이 생성된 바이트이기 때문에 실패합니다.os.urandom()
.
나는 대신에 이것을 사용하여 고쳤습니다.sha256_crypt
에서passlib
라이브러리, 그리고 인코딩된 해시+디버깅 조합을 저장합니다.CHAR(77)
.
도움을 준 사람들 덕분에 - 불행하게도, 저는 그 문제에 대해 너무 좁게 생각하고 있었고, 그래서 제 질문을 그렇게 표현했습니다.
큰따옴표를 사용해 보십시오.
query = ("SELECT user_id, user_password_hash, user_password_salt "
"FROM users "
"WHERE user_username = %s"
)
또는 트리플 인용문:
query = ("""SELECT user_id, user_password_hash, user_password_salt
FROM users
WHERE user_username = %s"""
)
query = """SELECT user_id, user_password_hash, user_password_salt FROM users WHERE user_username = %s"""
이것을 사용하면 효과가 있을 것입니다.
언급URL : https://stackoverflow.com/questions/60300884/unicode-and-incorrect-number-of-arguments-errors-with-python-3-and-mysql-connect
'programing' 카테고리의 다른 글
효율적인 순환 버퍼? (0) | 2023.07.22 |
---|---|
PyTorch에서 "CUDA 메모리 부족"을 방지하는 방법 (0) | 2023.07.22 |
Python에서 POST 및 GET 변수는 어떻게 처리됩니까? (0) | 2023.07.22 |
파이썬에서 어떻게 tmp 파일을 만들 수 있습니까? (0) | 2023.07.22 |
크로스 컴파일 시 외부 라이브러리를 사용하는 방법은 무엇입니까? (0) | 2023.07.22 |