python - 尝试执行插入查询时Python无效的参数类型
问题描述
我正在尝试执行此查询,但是我收到了错误,并且我正在使用 Microsoft SQL Server 作为数据库。
import urllib.request as urllib
import socket
import pyodbc
from datetime import datetime
import ssl
import OpenSSL
import re
#Timestamp for undersøgelse
timestamp = datetime.now().strftime('%d-%m-%Y %H:%M:%S')
#Responseheader request
request = urllib.Request('http://ucn.dk')
request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36')
response = urllib.urlopen(request)
rdata = response.info()
ipaddr = socket.gethostbyname(request.origin_req_host)
def get_certificate(host, port=443):
context = ssl.create_default_context()
conn = socket.create_connection((host, port))
sock = context.wrap_socket(conn, server_hostname=host)
der_cert = sock.getpeercert(True)
sock.close()
return ssl.DER_cert_to_PEM_cert(der_cert)
certificate = get_certificate(request.origin_req_host)
x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, certificate)
Pubkeyobj = x509.get_pubkey()
pubKeyString = OpenSSL.crypto.dump_publickey(OpenSSL.crypto.FILETYPE_PEM, Pubkeyobj)
pubkey = b'\n'.join(pubKeyString.splitlines()[1:-1])
keylength = Pubkeyobj.bits()
certvalidfrom = datetime.strptime(x509.get_notBefore().decode('ascii'), '%Y%m%d%H%M%SZ')
certvalidtill = datetime.strptime(x509.get_notAfter().decode('ascii'), '%Y%m%d%H%M%SZ')
extensions = (x509.get_extension(i) for i in range(x509.get_extension_count()))
extension_data = {e.get_short_name(): str(e) for e in extensions}
subj = x509.get_subject()
subjCN = x509.get_subject().CN
subjAlt = extension_data[b'subjectAltName']
serial = x509.get_serial_number()
issuerCN = x509.get_issuer().CN
sign = x509.get_signature_algorithm()
#SQL Connection til local database
con = pyodbc.connect('Driver={SQL Server Native Client 11.0};'
'Server=DESKTOP-THV2IDL;'
'Database=host;'
'Trusted_Connection=yes;')
cursor = con.cursor()
con.execute('INSERT INTO host.dbo.certificate (host, Subject, CommonName, AlternativeNames, PublicKey, KeyLength(BITS), SerialNumber, Validfrom, Validtill, Issuer(CN), CSA, Timestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
(request.full_url, subj, subjCN, subjAlt, pubkey, keylength, serial, certvalidfrom, certvalidtill, issuerCN, sign, timestamp))
con.commit()
我收到此错误:
文件“c:/Users/Farzad/Desktop/Python/Webscraping/Responseheaderinfo.py”,第 76 行,在
(request.full_url、subj、subjCN、subjAlt、pubkey、keylength、serial、certvalidfrom、certvalidtill、issuerCN、sign、timestamp ))
pyodbc.ProgrammingError: ('无效的参数类型。param-index=1 param-type=X509Name', 'HY105')
解决方案
文档说' X509Req
sget_subject()
方法返回一个X509Name
对象。此对象不能用作Subject
查询的字段;因为它们是 Python 对象,而您的 MSSQL Server 无法理解。
也许你把这个领域设计成一个VARCHAR
或什么的;所以你需要使用该X509Name
对象的一种方法来获取你想要在数据库中存储的实际值(可能是一个字符串?)。看看X509Name
这里的特点。
pickle.dumps()
或者您可能希望使用 Python 的方法将此对象的整个转换为字节数组,并将其作为 binary 保存到您的数据库中。
推荐阅读
- excel - 数据透视表 VBA 在我之前工作时显示编译错误
- r - 在绘图文本中结合斜体、粗体和对象值循环
- c# - 无法在自定义控件库中使用自定义字体和 FontAwesome 图标
- python - 为什么下面的代码不产生任何输出?
- css - 固定表格单元格以进行水平滚动
- javascript - 怎样才能找到id属性里面的数组出现了多少次?
- javascript - 如何削减2个小数位后的数字(JS)
- azure - 在处理 Azure 队列时,当 dequeueCount 超过时,有没有办法防止消息进入毒队列?
- svg - 在 SVG 中应用目的地输出合成
- html - 解决问题的链接一旦点击就会变成白色(不可见)