Как отобразить SQL INNER JOIN HTML с помощью Flask - PullRequest
0 голосов
/ 18 октября 2019

У меня есть некоторые проблемы с отображением значения из другой таблицы (это было бы легче понять с помощью приведенного ниже кода):

contact.py

def index():
    db = get_db()
    contacts = db.execute(
        'SELECT *'
        ' FROM contact INNER JOIN branche ON contact.branche_id = branche.branche_id'
        ' ORDER BY contact.nom ASC'
    ).fetchall()
    return render_template('contact/index.html', contacts=contacts)

templates / contact / index.html

<table class="table table-hover">
      <thead class="thead-light">
          <th>Nom</th>
          <th>Prénom</th>
          <th>Adresse Mail</th>
          <th>Code Postal</th>
          <th>Ville</th>
          <th>Téléphone Portable</th>
          <th>Branche</th>
      </thead>
      <tbody>
      <div class="col-md-4">
        <div class="form-group">
      <div runat="server" id="div_columns" >
        {% for contact in contacts %}
         <tr>
             <td>{{ contact['nom'] }}</td>
             <td>{{ contact['prenom'] }}</td>
             <td>{{ contact['telportable'] }}</td>
             <td>{{ contact['adressemail'] }}</td>
             <td>{{ contact['codepostal'] }}</td>
             <td>{{ contact['ville'] }}</td>
             <td>{{ contact['telportable'] }}</td>
             <td>{{ branche['branche_nom'] }}</td>
             <td> 
                <a class="btn"><i class="fas fa-pencil-alt"></i></a>
                <a class="btn text-danger "><i class="fa fa-trash fa-lg"></i></a>
            </td>
          </tr>
          {% endfor %}
              <hr>
          </div>
          </div>
          </div>
      </tbody>
    </table>

schema.sql

DROP TABLE IF EXISTS contact;
DROP TABLE IF EXISTS branche;

CREATE TABLE contact (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  nom TEXT NOT NULL,
  prenom TEXT NOT NULL,
  adressemail TEXT NOT NULL,
  adressepostale TEXT NOT NULL,
  codepostal INTEGER NOT NULL,
  ville TEXT NOT NULL,
  telfixe INTEGER NOT NULL,
  telportable INTEGER NOT NULL,
  branche_id INTEGER NOT NULL,
  FOREIGN KEY (branche_id) REFERENCES branche (branche_id)
);

CREATE TABLE branche (
  branche_id INTEGER PRIMARY KEY AUTOINCREMENT,
  branche_nom TEXT UNIQUE NOT NULL
);

Все, что я хочу сделать, это распечатать контакт информации (имя, номер телефона, ...), и есть одна информация, которая не находится внутри contact таблицы, это branche_nom в таблице branche, так где же моя ошибка? У меня нет никаких ошибок в терминальном компьютере или терминале браузера

PS: когда я отключаю отображение branche_nom, все строки, хранящиеся в БД, печатаются, у меня просто ничего нет, я хочу использовать другую таблицу

РЕДАКТИРОВАНИЕ 1: Загрузка branche таблица

contact.py

def index():
    db = get_db()
    contacts = db.execute(
        'SELECT contact.nom, contact.prenom, contact.adressemail, contact.codepostal, contact.ville, contact.telportable, branche.branche_nom'
        ' FROM contact INNER JOIN branche ON contact.branche_id = branche.branche_id'
        ' ORDER BY contact.nom ASC'
    ).fetchall()
    branches = db.execute(
        'SELECT branche_nom'
        ' FROM branche INNER JOIN contact ON contact.branche_id = branche.branche_id'
    ).fetchall()
    return render_template('blog/index.html', contacts=contacts, branches=branches)

Снимок экрана Branche List:

branche list screenshot

РЕДАКТИРОВАТЬ2: дБ.py

import sqlite3  
import click
from flask import current_app, g
from flask.cli import with_appcontext

def init_app(app):
    app.teardown_appcontext(close_db)
    app.cli.add_command(init_db_command)

def init_db():
    db = get_db()

    with current_app.open_resource('schema.sql') as d:
        db.executescript(d.read().decode('utf8'))

@click.command('init-db')
@with_appcontext
def init_db_command():
    """Clear the existing data and create new tables."""
    init_db()
    click.echo('Initialized the database.')


def get_db():
    if 'db' not in g:
        g.db = sqlite3.connect(
            current_app.config['DATABASE'],
            detect_types=sqlite3.PARSE_DECLTYPES
        )
        g.db.row_factory = sqlite3.Row

    return g.db

def close_db(e=None):
    db = g.pop('db', None)

    if db is not None:
        db.close()  

1 Ответ

0 голосов
/ 18 октября 2019

Во-первых, проверьте, чтобы таблица филиалов была заполнена соответствующими идентификаторами, поскольку внутреннее объединение вернет пустой курсор, когда идентификаторы в обеих таблицах не существуют.

Во-вторых, я бы попытался избежать * в select и goлибо для «SELECT contact. , branche. », либо для выбора фактических столбцов таблиц.

В-третьих, после попытки написания кода с помощью sqlite я обнаружил, что вы должны изменитьhtml шаблон вашего текущего контакта итератора, а не филиала,

например: не <td>{{ branche['branche_nom'] }}</td>, а <td>{{ contact['branche_nom'] }}</td>

Помимо опечатки, вы должны добавить команду, которая распознает ваши столбцы по именам,сразу после подключения init: db.row_factory = sqlite3.Row

Я запустил ваш полный пример, и он работает !! Полный код:

%%writefile contact.py
from flask import Flask, escape, url_for
from flask import render_template
import sqlite3

app = Flask(__name__)

def get_db():
    db = sqlite3.connect(r"/home/david/sqlite/db/pythonsqlite.db")
    return db

@app.route('/')
def index():
    db = get_db()
    db.row_factory = sqlite3.Row
    contacts = db.execute(
        'SELECT contact.nom, contact.prenom, contact.adressemail, contact.codepostal, contact.ville, contact.telportable, branche.branche_nom'
        ' FROM contact INNER JOIN branche ON contact.branche_id = branche.branche_id'
        ' ORDER BY contact.nom ASC'
    ).fetchall()
    return render_template('index.html', contacts=contacts)

Результаты:

enter image description here

Основная причина путаницы в том, как Джинджа интерпретирует курсор и его переменные(столбцы), разные базы данных имеют разные DB-API, ваш первый подход, к счастью, «понимает» столбцы имен (но не все из таблицы филиалов), так как если вы попытаетесь перебрать контакты, вы сможете получить доступ только к индексированному столбцу. (по номерам), с добавленной функцией sqlite3.Row курсор позволит вам получить доступ к столбцу по имени, и это то, что в конечном итоге вы передаете шаблону. получил это объяснение от: Как я могу ссылаться на столбцы по их именам в python, вызывающем SQLite?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...