PyQt 与 Sqlalchemy 的集成

编程入门 行业动态 更新时间:2024-10-15 20:22:17
本文介绍了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)) 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 的集成

本文发布于:2023-10-18 14:52:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1504553.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:PyQt   Sqlalchemy

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!