就像标题一样,我在这一行有这个问题。
mycursor.execute("UPDATE slot SET plaka=?,girisTarih=?,girisSaat=?,musaitlik=?, WHERE slotAd=?",plaka1,girisTarih,girisSaat,musaitlik,slotAd)
穆赛特里克 = 真/假(0-1) 插槽广告 = A1
import cv2
from matplotlib import pyplot as plt
import easyocr
import PIL.Image
import PIL.ImageTk
import os
import pyodbc
import datetime
import numpy as np
import imutils
import random
conn = pyodbc.connect('Driver={SQL Server};'
'Server=DESKTOP-L3245FSQLEXPRESS;'
'Database=CarPark;'
'Trusted_Connection=yes;''autocommit=True')
def giris(plaka1):
global plaka
print("girdi")
mycursor = conn.cursor()
mycursor.execute("SELECT plaka from slot where plaka=?",(plaka1))
kontrol=False
for x in mycursor:
if (x[0]==plaka1):
kontrol=True
if(kontrol):
print("Bu Araç Otoparktadır")
else:
mycursor = conn.cursor()
girisTarih = datetime.datetime.now().strftime("%d.%m.%Y")
girisSaat = datetime.datetime.now().strftime("%H:%M")
musaitlik = 0
mycursor.execute("SELECT slotAd FROM slot WHERE musaitlik='1'")
slotAd = mycursor.fetchone()
mycursor.execute("UPDATE slot SET plaka=?,girisTarih=?,girisSaat=?,musaitlik=?, WHERE slotAd=?",plaka1,girisTarih,girisSaat,musaitlik,slotAd)
conn.commit()
print(mycursor.rowcount, "Giriş Yapildi.")
plaka=""
tantuni = "52 AT 533"
giris(tantuni)
尝试
slotAd = mycursor.fetchval()
而不是
slotAd = mycursor.fetchone().
这解决了我的问题。
问题归结为您在传递fetchone
返回时尝试参数化序列/可迭代对象,该返回不返回一个标量值,而是返回一个值序列(即行)。如果只返回查询中的一列,则您有一个元素的序列/可迭代对象。
根据 Python 的 DB-API 规范 (PEP 249),其中pyodbc
基本遵守,fetchone
被指定返回(强调添加):
提取查询结果集的下一行,返回单个序列,如果没有更多数据可用,则返回 None。
因此,只需在参数化之前为特定的第一列值索引序列/可迭代的第一项,该参数只需要标量:
mycursor.execute("SELECT slotAd FROM slot WHERE musaitlik='1'")
slotAd = mycursor.fetchone()[0]
mycursor.execute(
"UPDATE slot SET plaka=?, girisTarih=?, girisSaat=?, musaitlik=? WHERE slotAd=?",
plaka1, girisTarih, girisSaat, musaitlik, slotAd
)
conn.commit()
根据 pyodbc 文档,建议的fetchval
特征为:
如果有结果,方便方法返回第一行的第一列,否则返回 None。
它可以fetchall()[0][0]
运行,也可以在引擎盖下fetchone()[0]
运行。