Использование Python для выбора динамической строки в базе данных Postgresql на основе целого числа, предоставленного в столбце из последнего выбора

1

Я только начал работать с Python сегодня, поэтому я на начальном уровне.

Я пытаюсь создать "дерево решений" с базой данных. После завершения он будет работать почти так же, как история "выбрать свое собственное приключение", как показано на примерах Python в Интернете.

У меня есть таблица в PostgreSQL со следующими столбцами: id, textfield, nextitem

Вот что я хочу сделать: скрипт -The начнется с некоторой записи в таблице. Для всех целей прямо сейчас, мы просто запустим его на id 1. Мы запросим эту первую строку (или любую другую строку может быть отправной точкой в будущем). Поэтому, если бы я должен был ссылаться прямо на Postgres, я бы просто выбрал * FROM mytable или SELECT * FROM mytable WHERE id = 1

Столбец -If [nextitem] не равен null, перейдите к целому числу в столбце. Итак, если SELECT * FROM mytable WHERE id = 1 имеет значение "4" в [nextitem], следующий запрос должен быть SELECT * FROM mytable WHERE id = 4. Этот процесс будет повторяться до тех пор, пока [nextitem] не будет NULL.

Я использую Python3 на сервере Ubuntu 16.04.3 с PostgreSQL 9.6 и psycopg2.

Я считаю, что мне нужно сделать, это вывести значение из столбца в переменную, а затем разрешить python возвращать его для будущего запроса, чем его цикл.

Вот что я до сих пор (мне нужна большая очистка, поскольку я сделал беспорядок, пытаясь по-разному в области, в которой я застрял, - мое зависание, похоже, заключается в том, чтобы отделить данные от запроса в переменной python и кормить это снова):

import psycopg2
try:
    connect_str = "dbname='mydatabase' user='myuser' host='localhost' " + \
                  "password='mypassword'"
    # establish a connection
    conn = psycopg2.connect(connect_str)
    # cursor that to execute queries
    cursor = conn.cursor()
    # start at the beginning, select the first text field
    sql = "SELECT textfield FROM mytable WHERE id=1"
    cursor.execute(sql)
    rows = cursor.fetchall()
    print(rows)
    cont = raw_input('Type Accept Continue')
    # if user accepts it is ok to proceed, advance to display data from next textfield
    if cont=='Accept':
        print("Accepted")
        sqn = "SELECT textfield, nextitem FROM mytable WHERE id=2"
        cursor.execute(sqn)
        rows = cursor.fetchall()
        print(rows)
        result_set = cursor.fetchall()
        #ideally, this should grab the integer in the [nextitem] column from last query and select the row corresponding to the integer
        for row in result_set:
        #print the integer to test the value and make sure it is correct
            print "%s" % (row["nextitem"])
        #attempt to assign this integer to a variable?
        x=["nextitem"]
        #attempt feeding the integer previously selected in [nextitem] into the next query
        sqv = "SELECT text FROM mytable WHERE id=%s"
        cursor.execute(sqv,x)
        result = cursor.fetchall()
        print(result)
    else:
        print("Rejected or Not Accepted")
except Exception as e:
    print("No Connection Available")
    print(e)
  • 0
    Почему бы вам просто НЕ SELECT id, text FROM mytable ORDER BY id ASC , а затем просмотрите набор результатов, основываясь на вводе пользователя? В противном случае создайте функцию, которая извлекает text для данного id .
Теги:
python-3.x
postgresql-9.6

1 ответ

1

Разделите операции с базой данных на отдельные функции. Это значительно облегчит процесс передачи программы.

Затем просто зацикливайтесь, извлекая текст сообщения с помощью идентификатора ввода, отобразите сообщение, получите вход → следующий идентификатор, повторите.

Вам не нужно условие "Принять", просто сделайте его частью первого текста (на mytable.id = 1): "Введите 2 для принятия, q для выхода".

def openDatabase():
    connect_str = "dbname='mydatabase' user='myuser' host='localhost' password='mypassword'"
    try:
        conn = psycopg2.connect(connect_str)
    except:
        sys.stderr.write("Unable to connect to database\n")
        conn = None
    return conn

def fetchSQL(db_conn, sql_query):
    cursor = db_conn.cursor()
    # start at the beginning, select the first text field
    cursor.execute(sql_query)
    rows = cursor.fetchall()
    #print(rows)
    return rows

def fetchItemText(db_conn, item_index):
    query = "SELECT textfield FROM mytable WHERE id=" + str(item_index)
    rows = fetchSQL(db_conn, query)
    if (len(rows) > 0):
        return rows[0][0] # Maybe just be rows[0]? Coding of the top of my head
    else:
        return ""

### Main
db = openDatabase()
if (db != None):
    # do some stuff
    finished = False
    user_choice = 1
    # Prompt the user with the text, get their input
    while (not finished):
        prompt = fetchItemText(db, user_choice)
        user_choice = raw_input(prompt + "\n>>>")
        if (user_choice == 'q'):
            finished = True
        else:
            user_choice = int(user_choice)  # TODO handle errors
  • 0
    Спасибо за детали в том, как разбить это на функции. Это, безусловно, чище, помогло мне учиться и указал мне в лучшем направлении, чтобы продолжить. Единственное, с чем я до сих пор сталкиваюсь, это то, как я могу присвоить значение из столбца в таблице переменной, которую нужно передать обратно. Я поработаю с этим новым сценарием некоторое время, и если я не смогу его понять добавить что-то здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню