Как оформить код подключения к SQL Server правильно в класс, чтобы таблица UserException выводилась в форму
Как оформить код подключения к SQL Server правильно в класс, а вывод таблицы в метод класса, чтобы таблица UserException выводилась в форму lr4 в таблицу ? Код ниже осуществляет подключение к бд (работает и верно выводит в консоль).
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
SERVER = 'SQLEXPRESS'
DATABASE = 'university'
USERNAME = 'vika'
PASSWORD = 'vvv'
DRIVER = 'ODBC Driver 17 for SQL Server'
DATABASE_CONNECTION = f'mssql+pyodbc://{USERNAME}:{PASSWORD}@{SERVER}/{DATABASE}?driver={DRIVER}'
engine = create_engine(DATABASE_CONNECTION, echo=True)
connection = engine.connect()
meta = MetaData()
UserException = Table('UserException', meta,
Column('id', Integer, primary_key=True),
Column('message', String),
Column('target_site', String),
Column('date_time_exc', DateTime),
Column('index_form', Integer))
s = UserException.select()
conn = engine.connect()
result = conn.execute(s)
for row in result:
print(row)
lr4Window должен лишь отображать записи из бд
class lr4Window(QtWidgets.QMainWindow):
def __init__(self, log_text_box):
super(lr4Window, self).__init__()
self.ui = Ui_Main_lr4()
self.ui.setupUi(self)
self.log_text_box = log_text_box
Прикрепляю еще класс в котором описан интерфейс формы.
class Ui_Main_lr4(object):
def setupUi(self, Main_lr4):
Main_lr4.setObjectName("Main_lr4")
Main_lr4.resize(800, 345)
self.centralwidget = QtWidgets.QWidget(Main_lr4)
self.centralwidget.setObjectName("centralwidget")
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setGeometry(QtCore.QRect(10, 10, 781, 261))
palette = QtGui.QPalette()
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(178, 173, 240))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Light, brush)
brush = QtGui.QBrush(QtGui.QColor(216, 214, 247))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Midlight, brush)
brush = QtGui.QBrush(QtGui.QColor(89, 86, 120))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Dark, brush)
brush = QtGui.QBrush(QtGui.QColor(119, 115, 160))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Mid, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.BrightText, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(178, 173, 240))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Shadow, brush)
brush = QtGui.QBrush(QtGui.QColor(216, 214, 247))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.AlternateBase, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 220))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipBase, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipText, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(178, 173, 240))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Light, brush)
brush = QtGui.QBrush(QtGui.QColor(216, 214, 247))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Midlight, brush)
brush = QtGui.QBrush(QtGui.QColor(89, 86, 120))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Dark, brush)
brush = QtGui.QBrush(QtGui.QColor(119, 115, 160))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Mid, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.BrightText, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(178, 173, 240))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Shadow, brush)
brush = QtGui.QBrush(QtGui.QColor(216, 214, 247))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.AlternateBase, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 220))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipBase, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipText, brush)
brush = QtGui.QBrush(QtGui.QColor(89, 86, 120))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(178, 173, 240))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Light, brush)
brush = QtGui.QBrush(QtGui.QColor(216, 214, 247))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Midlight, brush)
brush = QtGui.QBrush(QtGui.QColor(89, 86, 120))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Dark, brush)
brush = QtGui.QBrush(QtGui.QColor(119, 115, 160))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Mid, brush)
brush = QtGui.QBrush(QtGui.QColor(89, 86, 120))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.BrightText, brush)
brush = QtGui.QBrush(QtGui.QColor(89, 86, 120))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush)
brush = QtGui.QBrush(QtGui.QColor(178, 173, 240))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(178, 173, 240))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Shadow, brush)
brush = QtGui.QBrush(QtGui.QColor(178, 173, 240))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.AlternateBase, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 220))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipBase, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipText, brush)
self.tableWidget.setPalette(palette)
font = QtGui.QFont()
font.setBold(True)
font.setItalic(False)
font.setUnderline(False)
font.setWeight(75)
font.setStrikeOut(False)
font.setKerning(True)
font.setStyleStrategy(QtGui.QFont.PreferDefault)
self.tableWidget.setFont(font)
self.tableWidget.setMouseTracking(False)
self.tableWidget.setFocusPolicy(QtCore.Qt.NoFocus)
self.tableWidget.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)
self.tableWidget.setShowGrid(True)
self.tableWidget.setGridStyle(QtCore.Qt.CustomDashLine)
self.tableWidget.setWordWrap(True)
self.tableWidget.setCornerButtonEnabled(True)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(5)
self.tableWidget.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
Main_lr4.setCentralWidget(self.centralwidget)
self.retranslateUi(Main_lr4)
QtCore.QMetaObject.connectSlotsByName(Main_lr4)
def retranslateUi(self, Main_lr4):
_translate = QtCore.QCoreApplication.translate
Main_lr4.setWindowTitle(_translate("Main_lr4", "MainWindow"))
self.tableWidget.setSortingEnabled(False)
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("Main_lr4", "id"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("Main_lr4", "Message"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("Main_lr4", "TargetSite"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("Main_lr4", "Data TimeExc"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("Main_lr4", "IndexForm"))
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Попробуйте взглянуть на пример. Я думаю, что это вам должно помочь.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QWidget, QMessageBox, QTableWidgetItem
from sqlalchemy.engine import create_engine
from sqlalchemy.ext.declarative.api import declarative_base
from sqlalchemy.orm.session import sessionmaker
from sqlalchemy.sql.expression import and_
from sqlalchemy.sql.schema import Column
from sqlalchemy.sql.sqltypes import Integer, Text
# интерфейс формы
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 362)
self.gridLayout = QtWidgets.QGridLayout(Form)
self.gridLayout.setObjectName("gridLayout")
self.checkBoxName = QtWidgets.QCheckBox(Form)
self.checkBoxName.setObjectName("checkBoxName")
self.gridLayout.addWidget(self.checkBoxName, 0, 0, 1, 1)
self.checkBoxSeat = QtWidgets.QCheckBox(Form)
self.checkBoxSeat.setObjectName("checkBoxSeat")
self.gridLayout.addWidget(self.checkBoxSeat, 0, 2, 1, 1)
self.lineEditName = QtWidgets.QLineEdit(Form)
self.lineEditName.setObjectName("lineEditName")
self.gridLayout.addWidget(self.lineEditName, 0, 1, 1, 1)
self.tableWidget = QtWidgets.QTableWidget(Form)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(10)
self.tableWidget.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(6, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(7, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(8, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(9, item)
self.gridLayout.addWidget(self.tableWidget, 3, 0, 1, 4)
self.lineEditSeat = QtWidgets.QLineEdit(Form)
self.lineEditSeat.setObjectName("lineEditSeat")
self.gridLayout.addWidget(self.lineEditSeat, 0, 3, 1, 1)
self.lineEditPort = QtWidgets.QLineEdit(Form)
self.lineEditPort.setObjectName("lineEditPort")
self.gridLayout.addWidget(self.lineEditPort, 1, 3, 1, 1)
self.checkBoxPort = QtWidgets.QCheckBox(Form)
self.checkBoxPort.setObjectName("checkBoxPort")
self.gridLayout.addWidget(self.checkBoxPort, 1, 2, 1, 1)
self.checkBoxLicense = QtWidgets.QCheckBox(Form)
self.checkBoxLicense.setObjectName("checkBoxLicense")
self.gridLayout.addWidget(self.checkBoxLicense, 1, 0, 1, 1)
self.lineEditLicense = QtWidgets.QLineEdit(Form)
self.lineEditLicense.setObjectName("lineEditLicense")
self.gridLayout.addWidget(self.lineEditLicense, 1, 1, 1, 1)
self.pushButtonQuery = QtWidgets.QPushButton(Form)
self.pushButtonQuery.setObjectName("pushButtonQuery")
self.gridLayout.addWidget(self.pushButtonQuery, 2, 0, 1, 4)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.checkBoxName.setText(_translate("Form", "Имя"))
self.checkBoxSeat.setText(_translate("Form", "# места"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("Form", "номер"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("Form", "Имя"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("Form", "Номер документа"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("Form", "Номер рейса"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("Form", "Дата полета"))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(_translate("Form", "# места"))
item = self.tableWidget.horizontalHeaderItem(6)
item.setText(_translate("Form", "Посадочные ворота"))
item = self.tableWidget.horizontalHeaderItem(7)
item.setText(_translate("Form", "Серийный номер"))
item = self.tableWidget.horizontalHeaderItem(8)
item.setText(_translate("Form", "место вылета"))
item = self.tableWidget.horizontalHeaderItem(9)
item.setText(_translate("Form", "Пункт назначения"))
self.checkBoxPort.setText(_translate("Form", "Посадочные ворота"))
self.checkBoxLicense.setText(_translate("Form", "Номер документа"))
self.pushButtonQuery.setText(_translate("Form", "Запрос"))
engine = create_engine('sqlite:///data_q1204186.sqlite3', echo=True)
Base = declarative_base()
class Tourist(Base):
__tablename__ = 'tourist'
id = Column(Integer, primary_key=True)
name = Column(Text)
license = Column(Text)
flightnumber = Column(Text)
flightdate = Column(Text)
seatnumber = Column(Text)
boardingport = Column(Text)
no = Column(Text)
departurestation = Column(Text)
destinationstation = Column(Text)
class Window(QWidget, Ui_Form):
def __init__(self, *args, **kwargs):
super(Window, self).__init__(*args, **kwargs)
self.setupUi(self)
# Поле сращивания sql
self.sql = {}
# database подключение
self.session = sessionmaker(bind=engine)()
@pyqtSlot()
def on_pushButtonQuery_clicked(self):
""" Кнопка запроса """
self.applyName()
self.applySeat()
self.applyLicense()
self.applyPort()
if not self.sql:
return QMessageBox.warning(self, 'Запрос', 'Нет ввода')
# Очистить данные
self.tableWidget.clear()
# заголовок
self.tableWidget.setHorizontalHeaderLabels(
['номер', 'Полное имя', '# документа', '# рейса', 'дата полета',
'# места', 'выезд', 'серийный номер', 'Место вылета', 'Пункт назначения'])
# Параллельный запрос на основе выбранных полей
rets = self.session.query(Tourist).filter(
and_(*(key == value for key, value in self.sql.items()))).all()
if not rets:
return QMessageBox.information(self, 'Подсказка', 'Не найдено результатов')
self.tableWidget.setRowCount(len(rets))
# Добавить в таблицу на основе результатов запроса
for row, tourist in enumerate(rets):
self.tableWidget.setItem(row, 0, QTableWidgetItem(str(tourist.id)))
self.tableWidget.setItem(
row, 1, QTableWidgetItem(str(tourist.name)))
self.tableWidget.setItem(
row, 2, QTableWidgetItem(str(tourist.license)))
self.tableWidget.setItem(
row, 3, QTableWidgetItem(str(tourist.flightnumber)))
self.tableWidget.setItem(
row, 4, QTableWidgetItem(str(tourist.flightdate)))
self.tableWidget.setItem(
row, 5, QTableWidgetItem(str(tourist.seatnumber)))
self.tableWidget.setItem(
row, 6, QTableWidgetItem(str(tourist.boardingport)))
self.tableWidget.setItem(row, 7, QTableWidgetItem(str(tourist.no)))
self.tableWidget.setItem(
row, 8, QTableWidgetItem(str(tourist.departurestation)))
self.tableWidget.setItem(
row, 9, QTableWidgetItem(str(tourist.destinationstation)))
def applyName(self):
""" Имя """
if not self.checkBoxName.isChecked():
if Tourist.name in self.sql:
# удаление
self.sql.pop(Tourist.name)
# Update или добавить в словарь
else:
self.sql[Tourist.name] = self.lineEditName.text().strip()
def applySeat(self):
""" номер места """
if not self.checkBoxSeat.isChecked():
if Tourist.seatnumber in self.sql:
self.sql.pop(Tourist.seatnumber)
else:
self.sql[Tourist.seatnumber] = self.lineEditSeat.text().strip()
def applyLicense(self):
""" Номер документа """
if not self.checkBoxLicense.isChecked():
if Tourist.license in self.sql:
self.sql.pop(Tourist.license)
else:
self.sql[Tourist.license] = self.lineEditLicense.text().strip()
def applyPort(self):
""" Посадочные ворота """
if not self.checkBoxPort.isChecked():
if Tourist.boardingport in self.sql:
self.sql.pop(Tourist.boardingport)
else:
self.sql[Tourist.boardingport] = self.lineEditPort.text().strip()
if __name__ == '__main__':
import sys
import cgitb
sys.excepthook = cgitb.Hook(1, None, 5, sys.stderr, 'text')
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
