Я не понимаю, почему этот цикл завершается так, как он - PullRequest
0 голосов
/ 13 ноября 2011
checkSql = 'SELECT userid FROM bs_members WHERE userid = :checkUser'
doesUserExist = False
while True:
    doesUserExist = False
    newUser.userID = ga.getInput('Enter userID: ', "\w+$")
    checkUserID = ds.execute(checkSql,checkUser=newUser.userID)
    for row in ds:
        if row == checkUserID:
            doesUserExist = True
            print 'That user name is already in use.  Please enter a new username.'
            break
    if doesUserExist == False:
        break
    else:
        continue

Я использую модуль cx_Oracle с Python 2.7.Я пытаюсь предложить пользователю ввести идентификатор пользователя.Затем программа проверит, существует ли уже идентификатор пользователя и запрашивает ли он другой идентификатор пользователя.Метод execute - это вспомогательный метод, который использует метод execute из cx_Oracle для взаимодействия с базой данных Oracle.Метод getInput запрашивает у пользователя ввод, который затем проверяется на соответствие регулярному выражению.

Я знаю, что я ошибся, но я полагаю, что цикл while запускает первое действие, которое выполняется, если пользователю предлагаетсяидентификатор пользователя.Затем userID проверяется по базе данных.Цикл for запускается и проверяет, совпадает ли строка, возвращаемая ds.execute(), с идентификатором пользователя, предоставленным пользователем.Если это пользователь сказал использовать другое имя пользователя и break выходит из цикла for.Затем оператор if проверяет, существует ли пользователь, а если нет, прерывает цикл while.Если нет, то цикл while повторяется, поэтому пользователю предлагается ввести несуществующий идентификатор пользователя.

Что произойдет, если пользователю будет предложено ввести идентификатор пользователя, тогда ни одна из проверок никогда не будет происходить с пользователеми программа переходит к следующему коду.Что мне здесь не хватает?Я включил ссылку в документы для execute().Метод execute в приведенном выше коде является частью следующего вспомогательного метода:

def execute(self, statement, **parameters):
    if parameters is None:
        self._curs.execute(statement)
    else:
        self._curs.execute(statement,parameters)

Если мне нужно предоставить больше информации, сообщите мне.

edit: я забыл строку doesUserExist = Falseсразу после начала цикла while, поэтому я добавил это.

Ответы [ 2 ]

4 голосов
/ 13 ноября 2011

Ваш пользовательский метод execute ничего не возвращает, означая, что checkUserID в вашем коде будет None.

Кроме того, вас интересует, если вернется хотя бы одна строкапо запросу.Если их нет, то userID должен быть доступен.

В документах говорится, что вызов .fetchone() возвращает None, если больше нет доступных строк.Вы можете использовать это.

checkSql = 'SELECT userid FROM bs_members WHERE userid = :checkUser'
while True:
    newUser.userID = ga.getInput('Enter userID: ', "\w+$")
    ds.execute(checkSql,checkUser=newUser.userID)
    if ds.fetchone() is None:
        # This userID is available.
        break
    else:
        print 'That user name is already in use.  Please enter a new username.'

Я предполагаю, что ds является экземпляром Cursor или его подклассом.

0 голосов
/ 13 ноября 2011

По крайней мере, у вас должна быть строка doesUserExist = False в начале цикла while. В противном случае, если пользователь введет существующий идентификатор один раз, он продолжит цикл навсегда.

...