Python 尝试执行插入查询时参数类型无效
Python Invalid parameter type when trying to execute insert query
我正在尝试执行此查询,但出现错误,我正在使用 Microsoft SQL 服务器作为数据库。
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()
我收到这个错误:
File "c:/Users/Farzad/Desktop/Python/Webscraping/Responseheaderinfo.py", line 76, in
(request.full_url, subj, subjCN, subjAlt, pubkey, keylength, serial, certvalidfrom, certvalidtill, issuerCN, sign, timestamp))
pyodbc.ProgrammingError: ('Invalid parameter type. param-index=1 param-type=X509Name', 'HY105')
doc 表示 X509Req
的 get_subject()
方法 returns 是一个 X509Name
对象。该对象不能用作查询的 Subject
字段;因为它们是 Python 个对象,而您的 MSSQL Server 无法理解。
也许您将此字段设计为 VARCHAR
或其他内容;所以你需要使用 X509Name
对象的方法之一来获取你想要存储在数据库中的实际值(一个字符串,也许?)。 Take a look at X509Name
's characteristics here.
或者您可能希望使用 Python 的 pickle.dumps()
method and save it to your DB as binary.
将整个对象转换为字节数组
我正在尝试执行此查询,但出现错误,我正在使用 Microsoft SQL 服务器作为数据库。
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()
我收到这个错误:
File "c:/Users/Farzad/Desktop/Python/Webscraping/Responseheaderinfo.py", line 76, in
(request.full_url, subj, subjCN, subjAlt, pubkey, keylength, serial, certvalidfrom, certvalidtill, issuerCN, sign, timestamp))
pyodbc.ProgrammingError: ('Invalid parameter type. param-index=1 param-type=X509Name', 'HY105')
doc 表示 X509Req
的 get_subject()
方法 returns 是一个 X509Name
对象。该对象不能用作查询的 Subject
字段;因为它们是 Python 个对象,而您的 MSSQL Server 无法理解。
也许您将此字段设计为 VARCHAR
或其他内容;所以你需要使用 X509Name
对象的方法之一来获取你想要存储在数据库中的实际值(一个字符串,也许?)。 Take a look at X509Name
's characteristics here.
或者您可能希望使用 Python 的 pickle.dumps()
method and save it to your DB as binary.