【问题标题】:PyQt integration with SqlalchemyPyQt 与 Sqlalchemy 的集成
【发布时间】:2018-11-11 14:47:53
【问题描述】:

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

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 创建到数据库中的表单添加信息的代码 sn-p 吗?

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_())

【问题讨论】:

    标签: python sqlalchemy pyqt pyqt4


    【解决方案1】:

    首先你必须了解 self 的目标是什么,并且它在方法中的位置不只是任何人(因为它读作 What is the purpose of self?),例如在 def AddEmployee(Base, self) 中,另一方面,为什么你认为AddEmployee传递Base?,这没有意义,self必须是第一个参数,而你添加另一个参数这将是一个布尔值,因为单击默认该参数。 p>

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

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

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

    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_())
    

    【讨论】:

    • 感谢您的及时回答。我在执行您的代码后遇到此错误。"qlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) 错误绑定参数 0 - 可能不受支持的类型。[SQL: u'插入员工(姓名,电子邮件)值(?,?)'] [参数:(PyQt4.QtCore.QString(u'hi'),PyQt4.QtCore.QString(u'hi'))](此错误的背景在:sqlalche.me/e/rvf5)
    • Python2 还是 python3?
    • 我正在使用 Python2。再次感谢
    • @eyllanesc,我会的。谢谢
    • @rarevessell 如果我的回答对您有帮助,请不要忘记将其标记为正确,如果您不知道该怎么做,请查看tour,这是最好的感谢方式。跨度>
    猜你喜欢
    • 2013-02-08
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多