使用Python與數據庫交互


# -*- coding: utf-8 -*-
"""
Created on Sun Nov 18 19:25:01 2018

@author: wangm
"""

# 使用Python自帶的sqlite3模塊
# 創建數據庫中的表、在表中插入數據、以及在輸出中獲取數據並對行進行計數
#!/usr/bin/env python3
# 導入sqlite3模塊
import sqlite3

# 創建一個代表數據庫的連接對象,此處使用專用名詞 ':memory:' 在內存中創建一個數據庫
# 也可以使用其他名字,此時創建的數據庫會被保存在你的工作目錄,或者自己指定的路徑下
con = sqlite3.connect(':memory:')
#con = sqlite3.connect('mydatabase')
# 創建表sales,具有四個屬性
# 此處query內有多行,使用 “”“
query = """create table sales 
           (customer varchar(20), 
           product varchar(40), 
           amount float, date DATE);"""
# 執行query中的sql命令
con.execute(query)
# 將對數據庫做的修改提交,即保存到數據庫中
con.commit()

# 在表中插入四行數據
data = [('AAA', 'Apple', 10000.0, '2018-01-01'), 
        ('BBB', 'Huawei', 5000.0, '2018-02-01'), 
        ('CCC', 'Mi', 3000.0, '2018-03-01')]
# 此處statement只有一行,所以可以用 “
# 此處 ? 為占位符,在connect對象的con.execute()或con.executemany()方法中,需要提供
# 一個包含四個值得元組,元組中的值會按位置替換到sql語句中
# 這種替換的方法還有一個好處是可以防止SQL注入攻擊
statement = "insert into sales values(?, ?, ?, ?)"
# 為data中的每條數據元組都執行statement中的命令,此處執行四次
con.executemany(statement, data)
# 注意此處不能用con.execute()方法
# 出錯信息:ProgrammingError: Incorrect number of bindings supplied. The current statement uses 4, and there are 3 supplied.
#con.execute(statement, data)
con.commit()

# 查詢sales表
# 執行SQL語句"select * from sales",並將結果賦給一個光標對象cursor
cursor = con.execute("select * from sales")
# fetchall()取出SQL返回結果的所有行,並將這些行賦給rows
rows = cursor.fetchall()
# rows 的類型 <class 'list'>
#print(type(rows))

# 輸出查詢到的每一行,並對行計數
#row_counter = 0
#for row in rows:
    #print(row)
    #row_counter += 1
#print('row_counter is %d' % (row_counter))

"""
輸出結果:
('AAA', 'Apple', 10000.0, '2018-01-01')
('BBB', 'Huawei', 5000.0, '2018-02-01')
('CCC', 'Mi', 3000.0, '2018-03-01')
row_counter is 3
"""

# 根據上述的這些對SQL的操作,和前面的關於對CSV文件、Excel文件的操作,就可以很簡單的
# 將一個CSV文件或Excel文件存儲到數據庫中,成為數據庫中的一張表
# 以CSV文件為例,即讀取CSV文件每一行數據,使用insert,插入到數據庫中

# 除了上述的創建數據庫、創建表、向表中插入數據、查詢表中的數據之外
# 也可以在con.execute()中執行其他的插刪改操作

# 插入:
con.execute("insert into sales values(?, ?, ?, ?)", ('DDD', 'MeiZu', 2000.0, '2018-04-01'))
con.commit()

cursor = con.execute("select * from sales")
rows = cursor.fetchall()
row_counter = 0
for row in rows:
    print(row)
    row_counter += 1
print('row_counter is %d' % (row_counter))

# 修改
temp = [2500.0, '2018-05-01', 'DDD']
con.execute("update sales set amount=?, date=? where customer=?;", temp)
con.commit()
cursor = con.execute("select * from sales")
rows = cursor.fetchall()
row_counter = 0
for row in rows:
    print(row)
    row_counter += 1
print('row_counter is %d' % (row_counter))

# 刪除
temp = ['CCC']
con.execute("delete from sales where customer=?;", temp)
con.commit()
cursor = con.execute("select * from sales")
rows = cursor.fetchall()
row_counter = 0
for row in rows:
    print(row)
    row_counter += 1
print('row_counter is %d' % (row_counter))

"""
輸出結果:
('AAA', 'Apple', 10000.0, '2018-01-01')
('BBB', 'Huawei', 5000.0, '2018-02-01')
('CCC', 'Mi', 3000.0, '2018-03-01')
('DDD', 'MeiZu', 2000.0, '2018-04-01')
row_counter is 4
('AAA', 'Apple', 10000.0, '2018-01-01')
('BBB', 'Huawei', 5000.0, '2018-02-01')
('CCC', 'Mi', 3000.0, '2018-03-01')
('DDD', 'MeiZu', 2500.0, '2018-05-01')
row_counter is 4
('AAA', 'Apple', 10000.0, '2018-01-01')
('BBB', 'Huawei', 5000.0, '2018-02-01')
('DDD', 'MeiZu', 2500.0, '2018-05-01')
row_counter is 3

"""

上述代碼(以Python內置的sqlite為例)展示了如何連接數據庫,並在數據庫中新建table,並對table進行增刪改查操作

而下面在我准備連接MySQL時,出現下列錯誤:

#!/usr/bin/env python3
import csv
import MySQLdb
#from datetime import datetime, date

input_file = 'D:\wangm\Documents\learning\code\python\supplier_data.csv'

con = MySQLdb.connect(host='localhost', port=3306, db='test', user='root', passwd='1126')
c = con.cursor()
"""
file_reader = csv.reader(open(input_file, 'r', newline=''))
header = next(file_reader)
for row in file_reader:
    data = []
    for column_index in range(len(header)):
        data.append(str(row[column_index]).lstrip('$').replace(',', '').strip())
    print(data)
    c.execute("insert into supplier values (%s, %s, %s, %s, %s);", data)
con.commit()
print('')
"""

錯誤信息:OperationalError: (2059, <NULL>)

在網上找到的錯誤原因:MySQL8.0使用的新的認證加密方式導致了這種犯錯誤

具體可以查看此處:https://blog.csdn.net/rbborb/article/details/80541468

根據上述文章,我嘗試更新以下相關的庫,更新后相關庫的版本如下:

再次運行上述代碼,依然報錯。

上述文章還提供另一種方法,卸載MySQL,選擇之前版本

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM