Я использую библиотеку pypyodbc
и пытаюсь выполнить запрос select
в mssql, используя предложение where
.
Однако ошибка, которую я получаю, указывает на то, что синтаксис неверен.
Error here ('42000', "[42000] [FreeTDS][SQL Server]Incorrect syntax near the keyword 'User'.")
мой запрос в моей функции выглядит следующим образом:
try:
selectUserDetails = "SELECT Username,Password FROM User WHERE Username = ?"
cursor.execute(selectUserDetails,(username,))
for row in cursor:
print(row);
except Exception as e:
print('Error here ' + str(e))
Моя функция для получения курсора выглядит следующим образом:
def msDbCred():
try:
from msDb import connection_string
conn = pypyodbc.connect(connection_string)
cursor = conn.cursor();
return cursor;
except pymysql.err.OperationalError:
sys.exit("Invalid Input: Wrong username/db or password found, please try again")
cursor = msDbCred()
и мои учетные данные базы данных хранятся в другом файле с именем msDb.py
db_host = '127.0.0.1'
db_name = 'TD_1.0'
db_user = 'ReadOnly'
db_password = 'mypaswword'
connection_string = 'Driver=SQL Server;Server=' + db_host + ';Database=' + db_name + ';uid=' + db_user + ';PWD=' + db_password + ';'
Мой вопрос здесь в том, что-то не так с самим запросом. Поскольку я использую этот же формат в другом запросе в другом месте моего кода, и он работает. Или что-то еще не так с моими функциями?
ОБНОВИТЬ:
@Горд Томпсон сказал, что я должен изменить свой запрос.
я изменился, мой запрос;
selectUserDetails = "SELECT Username FROM [TD_1.0].[dbo].[User] WHERE Username = ?"
cursor.execute(selectUserDetails,(username,))
Однако теперь я получаю сообщение об ошибке;
('HY010', '[HY010] [unixODBC][Driver Manager]Function sequence error')
[User]
- person Gord Thompson   schedule 30.03.2017USER
— это ключевое слово. Вы должны обернуть его, например,[User]
. Вам необязательно использовать имя, состоящее из трех частей. Кроме того, в вашем запросе используется?
, что не соответствует тому, как параметры используются в SQL Server. FreeTDS все равно не поддерживает параметры, в лучшем случае выполняет подстановку. Дальнейшие проблемы - вместо хранения и сравнения хэшей вы загружаете пароль пользователя? Это почти напрашивается на взлом, как в новостях. - person Panagiotis Kanavos   schedule 31.03.2017SELECT COUNT(*) AS n FROM sys.objects
? - person Gord Thompson   schedule 31.03.2017@name
. Однако некоторые драйверы не поддерживают параметры. Вот когда используется?
. В остальном я уже предоставил ссылки на руководства и вопросы, связанные с передачей параметров в фактические параметризованные запросы. Наконец, использование поддельных параметров — это ответственность, а не преимущество. Вы не можете избежать SQL-инъекции таким образом или получить какие-либо преимущества параметризации, но код делает вид, что это не так. - person Panagiotis Kanavos   schedule 03.04.2017