Я только начал работать с 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)
Разделите операции с базой данных на отдельные функции. Это значительно облегчит процесс передачи программы.
Затем просто зацикливайтесь, извлекая текст сообщения с помощью идентификатора ввода, отобразите сообщение, получите вход → следующий идентификатор, повторите.
Вам не нужно условие "Принять", просто сделайте его частью первого текста (на 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
SELECT id, text FROM mytable ORDER BY id ASC
, а затем просмотрите набор результатов, основываясь на вводе пользователя? В противном случае создайте функцию, которая извлекаетtext
для данногоid
.