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

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

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

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

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

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

Я использую Python3 на Ubuntu Server 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)

1 Ответ

0 голосов
/ 20 октября 2018

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

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

Выне нужно условие «Принять», просто сделайте его частью первого текста (на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...