2015-11-23 2 views
0

Я написал службу web.py в python для доступа к PostGres и получения имен таблиц внутри конкретной базы данных.Извлечь строку из кортежа в python с psycopg2

КОД:

def GET(self,r): 
      web.header('Access-Control-Allow-Origin',  '*') 
      web.header('Access-Control-Allow-Credentials', 'true') 
      tables = [] 
      datasetID = web.input().dataSetID 
      cursor = conn.cursor() 
      cursor.execute("select relname from pg_class where relkind='r' and relname !~ '^(pg_|sql_)';") 
      tablesWithDetails = cursor.fetchall() 
      print tablesWithDetails 
      for x in tablesWithDetails: 
      x.replace("(", "") 
      x.replace(")","") 
      tables.append(x) 
      print tables; 

Это печатает таблицу следующим образом,

[('acam_datasegregationdetails',), ('acam_datasegregationheader',), ('idn_accessinformation',), ('idn_b2cuseraccountmapping',), ('idn_b2cuserdevicemapping',), ('idn_b2cusers',), ('idn_roles',), ('idn_useraccountmapping')] 

Необходим выход:

['acam_datasegregationdetails', 'acam_datasegregationheader', idn_accessinformation', 'idn_b2cuseraccountmapping', 'idn_b2cuserdevicemapping', 'idn_b2cusers', 'idn_roles', 'idn_useraccountmapping'] 
+3

попробовать это 'tables.append (х [0])' если это не работает, вы можете набрать 'type (x)' – The6thSense

+0

Спасибо, что это сработало – Sajeetharan

+0

Знаете ли вы, что это сработало? – The6thSense

ответ

3

падения, что петля и вместо того, чтобы сделать

tables = [t[0] for t in tablesWithDetails] 

Он построит список, содержащий первый элемент каждого кортежа в наборе результатов.

Или еще проще (и дешевле), если вы хотите получить список, то возвращает массив, который будет адаптирован к списку по Psycopg:

cursor.execute(""" 
    select array_agg(relname) 
    from pg_class 
    where relkind='r' and relname !~ '^(pg_|sql_)';" 
""") 
tables = cursor.fetchall()[0][0] 
+0

Затем, как запустить 'x.replace (" ("," ")' и 'x.replace (") "," ")'? –

+0

@Kevin Как я понимаю, это неправильно. ОП пытался «исправить» или «бросить» кортежи в возвращенном списке, предположив, что он может каким-то образом рассматриваться как строка. –

+0

Хм ... может быть. Однако кортежи не имеют метода '.replace()'. Upvoted. –

2

Проблема обусловлена ​​этот кусок кода

tables.append(x) 

При выполнении cursor.fetchall() вы получите список кортежей

и когда вы делаете for x in tablesWithDetails: вы итерацию по списку с помощью one tuple at a time

Так что, когда вы делаете tables.append(x) вы присоединяя один элемент кортеж к списку

Чтобы изменить это, вы можете сделать это tables.append(x[0]) он добавляет первый элемент кортежа

+1

Кстати, что относительно 'tables.extend (x)'? –

+0

@KevinGuan это, безусловно, будет работать при этом условии, но что, если в корте есть много элементов, тогда 'extend' добавит весь элемент – The6thSense

+0

Да, просто подумайте, что использование' .extend' было бы более понятным при этом условии: P –

Смежные вопросы