我正在尝试通过 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)) sessionmit() 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 建议不要修改设计,而是创建另一个继承适当小部件的类并用设计填充它(更多信息阅读 pyqt.sourceforge/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 pyqt.sourceforge/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)) sessionmit() if __name__ == "__main__": import sys app = QtGui.QApplication(sys.argv) w = Dialog() w.show() sys.exit(app.exec_())更多推荐
PyQt 与 Sqlalchemy 的集成
发布评论