pyobdc 更新查询成功执行但未更新数据库

发布于 2025-01-11 02:31:01 字数 3809 浏览 0 评论 0原文

我在使用 pyodbc 执行 MS SQL 更新查询时遇到问题。查询执行成功,但数据库条目未更新。在 sql Management Studio 中运行相同的查询会返回 800 多个条目的成功更新。 我做错了什么?

import pyodbc
    
conn = pyodbc.connect('Driver={SQL Server};'
                          'Server=SERVER2020;'
                          'Database=Auftragsmanagement;'
                          'Trusted_Connection=yes;')
    
sql_einkaufspreis_in_artikel_schreiben = "UPDATE dbo.Artikel " \
                                            "SET Artikel.Einkaufspreis = t.Einkaufspreis " \
                                            "from dbo.Artikel A " \
                                            "Inner Join " \
                                            "(select a.id, " \
                                                "(sum(IIF(e.kategorie NOT IN (7, 10), r.menge*IIF(a.NutzeManuellenPreisInKalkulation = 1 AND r.manuellerPreis != 0, r.manuellerPreis, IIF(t.preis IS NOT NULL,  t.preis/e.Berechnungsmenge, e.preis/e.Berechnungsmenge))/(1-a.Kalkulation_Verlust/100), 0))/" \
                                                "sum(IIF(e.kategorie NOT IN (7, 10, 3, 26), r.menge, 0))+" \
                                                "sum(IIF(e.kategorie IN (7, 10), r.menge*IIF(a.NutzeManuellenPreisInKalkulation = 1 AND r.manuellerPreis != 0, r.manuellerPreis, IIF(t.preis IS NOT NULL, t.preis/e.Berechnungsmenge, e.preis/e.Berechnungsmenge)), 0)))*a.Kalkulationsgewicht AS Einkaufspreis " \
                                            "from dbo.Artikel A " \
                                            "INNER JOIN dbo.Rezeptur R ON R.Artikel = a.id " \
                                            "INNER JOIN dbo.Einkaufsartikel E ON r.einkaufsartikel = e.id " \
                                            "INNER JOIN dbo.Lieferant L ON l.id = e.lieferant " \
                                            "LEFT JOIN dbo.EinkaufsartikelMapping EPM ON epm.Einkaufsartikel = e.ID " \
                                            "LEFT JOIN dbo.EinkaufsartikelSpezifikation EP ON ep.id = epm.EinkaufsartikelSpezifikation " \
                                            "FULL OUTER JOIN (SELECT ep.id, e.Preis, e.LetzteLieferung " \
                                                            "FROM (" \
                                                                "SELECT ROW_NUMBER() OVER (PARTITION BY EP.ID ORDER BY e.LetzteLieferung DESC) AS LASTORDER, e.id " \
                                                                "FROM dbo.Einkaufsartikel E, dbo.EinkaufsartikelSpezifikation EP, dbo.EinkaufsartikelMapping EPM " \
                                                                "WHERE e.id = epm.Einkaufsartikel and ep.id = epm.EinkaufsartikelSpezifikation) as list, dbo.Einkaufsartikel E " \
                                                            "INNER JOIN dbo.EinkaufsartikelMapping EPM ON e.id = epm.Einkaufsartikel " \
                                                            "INNER JOIN dbo.EinkaufsartikelSpezifikation EP ON epm.EinkaufsartikelSpezifikation = ep.ID " \
                                                            "where list.ID = e.ID and list.LASTORDER <= 1 " \
                                                            "GROUP BY ep.id, e.LetzteLieferung, e.Preis) t ON t.ID = ep.ID " \
                                            "where a.kategorie != 99 and a.IstKalkuliert = 1 and a.Gelöscht = 0 " \
                                            "group by a.id, a.Kalkulationsgewicht) t ON t.id = a.ID"
    
cursor = conn.cursor()
cursor.execute(sql_einkaufspreis_in_artikel_schreiben)
cursor.commit()
cursor.close()
conn.close()

尝试更新行时 pyodbc 是否有任何限制?

cursor.rowcount 返回 865 行。为什么返回一个值但不更新。

编辑

在查询开头添加 SET NOCOUNT ON 可以解决问题,但随后我将无法获得受影响的行数。还有其他解决方案吗?

I have a problem with executing an MS SQL Update query with pyodbc. The query executes successfully but the database entries are not being updated. Running the same query in sql management studio return an successfull update of over 800 entries.
What am I doing wrong?

import pyodbc
    
conn = pyodbc.connect('Driver={SQL Server};'
                          'Server=SERVER2020;'
                          'Database=Auftragsmanagement;'
                          'Trusted_Connection=yes;')
    
sql_einkaufspreis_in_artikel_schreiben = "UPDATE dbo.Artikel " \
                                            "SET Artikel.Einkaufspreis = t.Einkaufspreis " \
                                            "from dbo.Artikel A " \
                                            "Inner Join " \
                                            "(select a.id, " \
                                                "(sum(IIF(e.kategorie NOT IN (7, 10), r.menge*IIF(a.NutzeManuellenPreisInKalkulation = 1 AND r.manuellerPreis != 0, r.manuellerPreis, IIF(t.preis IS NOT NULL,  t.preis/e.Berechnungsmenge, e.preis/e.Berechnungsmenge))/(1-a.Kalkulation_Verlust/100), 0))/" \
                                                "sum(IIF(e.kategorie NOT IN (7, 10, 3, 26), r.menge, 0))+" \
                                                "sum(IIF(e.kategorie IN (7, 10), r.menge*IIF(a.NutzeManuellenPreisInKalkulation = 1 AND r.manuellerPreis != 0, r.manuellerPreis, IIF(t.preis IS NOT NULL, t.preis/e.Berechnungsmenge, e.preis/e.Berechnungsmenge)), 0)))*a.Kalkulationsgewicht AS Einkaufspreis " \
                                            "from dbo.Artikel A " \
                                            "INNER JOIN dbo.Rezeptur R ON R.Artikel = a.id " \
                                            "INNER JOIN dbo.Einkaufsartikel E ON r.einkaufsartikel = e.id " \
                                            "INNER JOIN dbo.Lieferant L ON l.id = e.lieferant " \
                                            "LEFT JOIN dbo.EinkaufsartikelMapping EPM ON epm.Einkaufsartikel = e.ID " \
                                            "LEFT JOIN dbo.EinkaufsartikelSpezifikation EP ON ep.id = epm.EinkaufsartikelSpezifikation " \
                                            "FULL OUTER JOIN (SELECT ep.id, e.Preis, e.LetzteLieferung " \
                                                            "FROM (" \
                                                                "SELECT ROW_NUMBER() OVER (PARTITION BY EP.ID ORDER BY e.LetzteLieferung DESC) AS LASTORDER, e.id " \
                                                                "FROM dbo.Einkaufsartikel E, dbo.EinkaufsartikelSpezifikation EP, dbo.EinkaufsartikelMapping EPM " \
                                                                "WHERE e.id = epm.Einkaufsartikel and ep.id = epm.EinkaufsartikelSpezifikation) as list, dbo.Einkaufsartikel E " \
                                                            "INNER JOIN dbo.EinkaufsartikelMapping EPM ON e.id = epm.Einkaufsartikel " \
                                                            "INNER JOIN dbo.EinkaufsartikelSpezifikation EP ON epm.EinkaufsartikelSpezifikation = ep.ID " \
                                                            "where list.ID = e.ID and list.LASTORDER <= 1 " \
                                                            "GROUP BY ep.id, e.LetzteLieferung, e.Preis) t ON t.ID = ep.ID " \
                                            "where a.kategorie != 99 and a.IstKalkuliert = 1 and a.Gelöscht = 0 " \
                                            "group by a.id, a.Kalkulationsgewicht) t ON t.id = a.ID"
    
cursor = conn.cursor()
cursor.execute(sql_einkaufspreis_in_artikel_schreiben)
cursor.commit()
cursor.close()
conn.close()

Are there any limitations in pyodbc when trying to update rows?

cursor.rowcount returns 865 rows. Why does is return an value but doesn't update.

EDIT

Adding SET NOCOUNT ON at the beginning of the query solves the problem, but then I won't have the number of affected rows. Is there another solution for that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

柒七 2025-01-18 02:31:01

使用一个非常简单的示例进行尝试,使其正常工作,然后您可以继续使用更复杂的示例。你现在所拥有的非常复杂。

请参阅下面的链接了解更多详细信息。

https://pandas.pydata.org/ pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html

https://datatofish.com/import-csv-sql-server-python/

https://www.dataquest.io/blog/sql-insert-tutorial/

Try it with a very simple example, get that working, and then you can move on to more complex examples. What you have now is pretty complex.

See the links below for more details.

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html

https://datatofish.com/import-csv-sql-server-python/

https://www.dataquest.io/blog/sql-insert-tutorial/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文