बयानों के लिए SQLalchemy rowcount हमेशा -1
जब मैं एक अजीब व्यवहार में आया, तो मैं टांगने के लिए SQLalchemy और Microsoft SQL Server के साथ खेल रहा था। मुझे सिखाया गया था कि परिणाम प्रॉक्सी ऑब्जेक्ट पर पंक्तिबद्धता बताएगी कि किसी कथन को निष्पादित करने से कितनी पंक्तियाँ प्रभावित हुईं। हालांकि, जब मैं अपने परीक्षण डेटाबेस में एकल या एकाधिक पंक्तियों का चयन करता हूं या सम्मिलित करता हूं, तो मुझे हमेशा -1 मिलता है। यह कैसे हो सकता है और वास्तविकता को प्रतिबिंबित करने के लिए मैं इसे कैसे ठीक कर सकता हूं?
connection = engine.connect()
metadata = MetaData()
# Ex1: select statement for all values
student = Table('student', metadata, autoload=True, autoload_with=engine)
stmt = select([student])
result_proxy = connection.execute(stmt)
results = result_proxy.fetchall()
print(result_proxy.rowcount)
# Ex2: inserting single values
stmt = insert(student).values(firstname='Severus', lastname='Snape')
result_proxy = connection.execute(stmt)
print(result_proxy.rowcout)
# Ex3: inserting multiple values
stmt = insert(student)
values_list = [{'firstname': 'Rubius', 'lastname': 'Hagrid'},
{'firstname': 'Minerva', 'lastname': 'McGonogall'}]
result_proxy = connection.execute(stmt, values_list)
print(result_proxy.rowcount)
प्रत्येक ब्लॉक के लिए प्रिंट फ़ंक्शन अलग-अलग उदाहरण कोड प्रिंट -1 चलाते हैं। Ex1 सफलतापूर्वक सभी पंक्तियों को प्राप्त करता है और दोनों विवरण सफलतापूर्वक डेटाबेस में डेटा लिखते हैं।
निम्न समस्या के अनुसार, पंक्तिबद्ध विशेषता हमेशा विश्वसनीय नहीं होती है। क्या यहाँ भी यही सच है? और कब, मैं SQLalcehmy लेन-देन में काउंट स्टेटमेंट की भरपाई कैसे कर सकता हूं? PDO :: rowCount () -1 लौट रहा है
जवाब
एकल-पंक्ति INSERT … VALUES ( … )तुच्छ है: यदि कथन सफल होता है तो एक पंक्ति प्रभावित हुई थी, और यदि यह विफल हो जाती है (त्रुटि को फेंकता है) तो शून्य पंक्तियाँ प्रभावित हुई थीं।
INSERTयदि कोई त्रुटि होती है, तो बहु-पंक्ति के लिए इसे लेन-देन और रोलबैक के अंदर करें। तब प्रभावित पंक्तियों की संख्या या तो शून्य या हो जाएगा len(values_list)।
पंक्तियों को एक चयन की संख्या प्राप्त करने के लिए होगा , वापसी एक में चुनिंदा क्वेरी लपेट SELECT count(*)उदाहरण के लिए क्वेरी और है कि पहली चलाने के लिए,:
select_stmt = sa.select([Parent])
count_stmt = sa.select([sa.func.count(sa.text("*"))]).select_from(
select_stmt.alias("s")
)
with engine.connect() as conn:
conn.execution_options(isolation_level="SERIALIZABLE")
rows_found = conn.execute(count_stmt).scalar()
print(f"{rows_found} row(s) found")
results = conn.execute(select_stmt).fetchall()
for item in results:
print(item.id)