PyQt 与 Sqlalchemy 的集成 [英] PyQt integration with Sqlalchemy

查看:66
本文介绍了PyQt 与 Sqlalchemy 的集成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过 Sqlalchemy 将我用 PyQt 创建的表单添加到数据库中,但我想我的代码有问题.我收到此错误

I am trying to add a form I created with PyQt into database through Sqlalchemy but I guess something is wrong with my code.I am getting this error

le "/Users/tunji/Desktop/employee.py", line 57, in AddEmployee
session = session.add(Employee(self.name,self.email))
AttributeError: 'bool' object has no attribute 'name'.

谁能帮忙提供一个代码片段,该代码片段可以通过使用 Sqlalchemy 创建到数据库中的表单添加信息?

Can anyone help with a code snippet that can add information through a form created into database using Sqlalchemy?

from PyQt4 import QtCore, QtGui

import sqlalchemy 
from sqlalchemy.ext.declarative import declarative_base

# My base structure

Base = declarative_base()


try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Employee(Base):
    __tablename__   = 'employees'   
    employee_id     = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)

    name            = sqlalchemy.Column(sqlalchemy.String, nullable=False)

    email           = sqlalchemy.Column(sqlalchemy.String)

    def __repr__(self):
       return "<User(name='%s', email='%s')>" % (self.name, self.email)

engine = sqlalchemy.create_engine("sqlite:///my_db.db", echo='debug')
Base.metadata.create_all(engine)
DBsession = sqlalchemy.orm.sessionmaker(bind=engine)
session = DBsession()



class Ui_Dialog(object):
    DBsession = sqlalchemy.orm.sessionmaker(bind=engine)
    session = DBsession()

    def AddEmployee(Base,self):
        session = DBsession()
        session = session.add(Employee(self.name,self.email))
        session.commit()

    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(400, 276)
        self.name_lineEdit = QtGui.QLineEdit(Dialog)
        self.name_lineEdit.setGeometry(QtCore.QRect(180, 30, 113, 21))
        self.name_lineEdit.setObjectName(_fromUtf8("name_lineEdit"))
        self.email_lineEdit = QtGui.QLineEdit(Dialog)
        self.email_lineEdit.setGeometry(QtCore.QRect(180, 90, 113, 21))
        self.email_lineEdit.setObjectName(_fromUtf8("email_lineEdit"))
        self.name_label = QtGui.QLabel(Dialog)
        self.name_label.setGeometry(QtCore.QRect(80, 30, 60, 16))
        self.name_label.setObjectName(_fromUtf8("name_label"))
        self.email_label = QtGui.QLabel(Dialog)
        self.email_label.setGeometry(QtCore.QRect(80, 90, 60, 16))
        self.email_label.setObjectName(_fromUtf8("email_label"))
        self.add_employee_btn = QtGui.QPushButton(Dialog)
        self.add_employee_btn.setGeometry(QtCore.QRect(180, 170, 113, 32))
        self.add_employee_btn.setObjectName(_fromUtf8("add_employee_btn"))
        self.add_employee_btn.clicked.connect(self.AddEmployee)

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Add Employee", None))
        self.name_label.setText(_translate("Dialog", "Name", None))
        self.email_label.setText(_translate("Dialog", "email", None))
        self.add_employee_btn.setText(_translate("Dialog", "AddEmployee", None))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

推荐答案

首先你必须明白 self 的目标是什么,它在方法中的位置不只是任何人(因为它读作 self 的目的是什么?),例如在 def AddEmployee(Base, self),另一方面,你为什么认为AddEmployee传递了Base?,那没有意义,self必须是第一个参数,你添加另一个参数this将是一个布尔值,因为点击默认该参数.

First of all you must understand what is the goal of self and that its position within the methods is not just anybody (for that it reads What is the purpose of self?), for example in def AddEmployee(Base, self), on the other hand, why do you think that AddEmployee pass the Base?, that does not make sense, the self must be the first to parameter, and your add another parameter this will be a Boolean because clicked to default that parameter.

另一方面,PyQt 建议不要修改设计,而是创建另一个继承适当小部件的类并用设计填充它(更多信息阅读 http://pyqt.sourceforge.net/Docs/PyQt5/designer.html).

On the other hand PyQt recommend not to modify the design but to create another class that inherits the appropriate widget and fill it with the design (for more information reads http://pyqt.sourceforge.net/Docs/PyQt5/designer.html).

另一个错误是你必须学会​​重用而不是不必要地创建.另一个错误是 session.add() 不返回任何内容.

Another mistake is that you must learn to reuse instead of create unnecessarily. Another error is that session.add() does not return anything.

考虑并更正上述错误,得到以下结果:

Considering and correcting the errors indicated above, the following is obtained:

from PyQt4 import QtCore, QtGui

import sqlalchemy 
from sqlalchemy.ext.declarative import declarative_base


try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(400, 276)
        self.name_lineEdit = QtGui.QLineEdit(Dialog)
        self.name_lineEdit.setGeometry(QtCore.QRect(180, 30, 113, 21))
        self.name_lineEdit.setObjectName(_fromUtf8("name_lineEdit"))
        self.email_lineEdit = QtGui.QLineEdit(Dialog)
        self.email_lineEdit.setGeometry(QtCore.QRect(180, 90, 113, 21))
        self.email_lineEdit.setObjectName(_fromUtf8("email_lineEdit"))
        self.name_label = QtGui.QLabel(Dialog)
        self.name_label.setGeometry(QtCore.QRect(80, 30, 60, 16))
        self.name_label.setObjectName(_fromUtf8("name_label"))
        self.email_label = QtGui.QLabel(Dialog)
        self.email_label.setGeometry(QtCore.QRect(80, 90, 60, 16))
        self.email_label.setObjectName(_fromUtf8("email_label"))
        self.add_employee_btn = QtGui.QPushButton(Dialog)
        self.add_employee_btn.setGeometry(QtCore.QRect(180, 170, 113, 32))
        self.add_employee_btn.setObjectName(_fromUtf8("add_employee_btn"))

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Add Employee", None))
        self.name_label.setText(_translate("Dialog", "Name", None))
        self.email_label.setText(_translate("Dialog", "email", None))
        self.add_employee_btn.setText(_translate("Dialog", "AddEmployee", None))


Base = declarative_base()

class Employee(Base):
    __tablename__   = 'employees'   
    employee_id     = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
    name            = sqlalchemy.Column(sqlalchemy.String, nullable=False)
    email           = sqlalchemy.Column(sqlalchemy.String)

    def __repr__(self):
       return "<User(name='%s', email='%s')>" % (self.name, self.email)

engine = sqlalchemy.create_engine("sqlite:///my_db.db", echo='debug')
Base.metadata.create_all(engine)
DBsession = sqlalchemy.orm.sessionmaker(bind=engine)
session = DBsession()

class Dialog(QtGui.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)
        self.add_employee_btn.clicked.connect(self.addEmployee)

    @QtCore.pyqtSlot()
    def addEmployee(self):
        name = str(self.name_lineEdit.text())
        email = str(self.email_lineEdit.text())
        session.add(Employee(name=name, email=email))
        session.commit()

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    w = Dialog()
    w.show()
    sys.exit(app.exec_())

这篇关于PyQt 与 Sqlalchemy 的集成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆