Ich habe diese Pyodbc- und SQL -Alchemie -Verbindungszeichenfolge. Es funktioniert in seinem eigenen Testskript einwandfrei, aber wenn ich die gleiche Funktion in meine PyQT6 -App stecke, fällt es mit < /p>
Pyodbc.Error: ('Hy000', 'Der Treiber hat keinen Fehler geliefert!') < /P> < /> < /blockquote>
def on_login(username, password, dsn):
odbc_connect = f"DSN={dsn};UID={username};PWD={password}"
conn = pyodbc.connect(odbc_connect)
dbms = str(conn.getinfo(pyodbc.SQL_DBMS_NAME)).lower()
engine = sa.create_engine(f"{dbms}+pyodbc://{username}:{password}@{dsn}")
with engine.connect() as connection:
df = pd.read_sql("SELECT * from sakila.Actor LIMIT 100;", connection)
print(df)
conn.close()
< /code>
Dies ist die vollständige Form, mit der es in der Haupt -PyQT -App angeschlossen ist. Der einzige Unterschied ist die Parameter selbst anstelle des Benutzernamens, Passwort, dsn. < /P>
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QComboBox, QVBoxLayout, QFormLayout, QTableWidget
from PyQt6.QtGui import QKeySequence
from PyQt6.QtCore import Qt, QThread, pyqtSignal
from PyQt6.QtSql import QSqlDatabase
import pyodbc
import sqlalchemy as sa
import sys
import QuerySQL
import pandas as pd
#MainWindow constructor
class MainWindow(QWidget):
def __init__(self):
super().__init__()
main_layout = QVBoxLayout(self)
self.setLayout(main_layout)
#LOGIN SCREEN
self.loginsubwidget = QWidget(self, toolTip = 'Login to Server')
login_layout = QVBoxLayout(self.loginsubwidget)
label = QLabel('Server Login', self.loginsubwidget, margin = 10)
login_layout.addWidget(label)
form_layout = QFormLayout()
login_layout.addLayout(form_layout)
self.DSNcombo = QComboBox(self)
available_dsn = pyodbc.dataSources()
if available_dsn:
self.DSNcombo.addItems(available_dsn.keys())
else:
self.DSNcombo.addItems("No DSNs found")
form_layout.addRow('DSN', self.DSNcombo)
self.usernameenter = QLineEdit(self.loginsubwidget, placeholderText='username', clearButtonEnabled=True, maxLength=20)
form_layout.addRow('Username', self.usernameenter)
self.passwordenter = QLineEdit(self.loginsubwidget, placeholderText='password')
self.passwordenter.setEchoMode(QLineEdit.EchoMode.Password)
form_layout.addRow('Password', self.passwordenter)
dbconnect_button = QPushButton('Submit', self, shortcut=QKeySequence(Qt.Key.Key_Return))
login_layout.addWidget(dbconnect_button)
dbconnect_button.clicked.connect(self.on_login)
# MAIN WINDOW
main_layout.addWidget(self.loginsubwidget)
self.content_widget = QWidget(self)
content_layout = QVBoxLayout(self.content_widget)
self.content_widget.hide()
#KEEP AS LAST ITEM - SETS CURSOR IN THE USERNAME BOX ON LAUNCH
self.usernameenter.setFocus()
def on_login(self):
username = self.usernameenter.text()
password = self.passwordenter.text()
dsn = self.DSNcombo.currentText()
odbc_connect = f"DSN={dsn};UID={username};PWD={password}"
conn = pyodbc.connect(odbc_connect)
dbms = str(conn.getinfo(pyodbc.SQL_DBMS_NAME)).lower()
engine = sa.create_engine(f"{dbms}+pyodbc://{username}:{password}@{dsn}")
with engine.connect() as connection:
df = pd.read_sql("SELECT * from sakila.Actor LIMIT 100;", connection)
print(df)
# Close the connection
conn.close()
#main code execution
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.setWindowTitle('Report Builder')
window.resize(400, 150)
window.show()
sys.exit(app.exec())
< /code>
Dies ist mein erstes Mal mit PYQT, und an diesem Punkt versuche ich nur, eine Verbindung zu meiner ODBC -Verbindung herzustellen, um von dort aus zu bauen. Mein Test ODBC ist eine localhost mySQL -Datenbank, wenn dies hilft, aber genau dieselbe Funktion funktioniert einwandfrei im separaten Skript außerhalb des Formulars.
Pyodbc -Funktion funktioniert allein, aber nicht in Pyqt6 ⇐ Python
-
- Similar Topics
- Replies
- Views
- Last post