day22-MySQL入門

来源:https://www.cnblogs.com/sbhglqy/p/18155011
-Advertisement-
Play Games

1. 安裝 & 配置 & 啟動 MySQL現在的版本主要分為: 5.x 版本,現在互聯網企業中的主流版本,包括:頭條、美圖、百度、騰訊等互聯網公司主流的版本。 8.x 版本,新增了一些了視窗函數、持久化配置、隱藏索引等其他功能。 所以,我們課程會以常用大版本中最新的版本為例來講解,即:5.7.31 ...


1. 安裝 & 配置 & 啟動

MySQL現在的版本主要分為:

  • 5.x 版本,現在互聯網企業中的主流版本,包括:頭條、美圖、百度、騰訊等互聯網公司主流的版本。
  • 8.x 版本,新增了一些了視窗函數、持久化配置、隱藏索引等其他功能。

所以,我們課程會以常用大版本中最新的版本為例來講解,即:5.7.31 (依然有很多企業在用5.6.x,但新項目基本上都是5.7.x了)。

1.1 win系統

第1步:下載安裝

https://downloads.mysql.com/archives/community/
image

第2步:解壓至任意文件夾

建議解壓至軟體安裝目錄,例如:
image

第3步:創建配置文件

在MySQL的安裝目錄下創建 my.ini 的文件,作為MySQL的配置文件。
image

其實,MySQL的配置文件可以放在很多的目錄,下圖是配置文件的優先順序:
image

強烈,建議大家還是把配置文件放在MySQL安裝目錄下,這樣以後電腦上想要安裝多個版本的MySQL時,配置文件可以相互獨立不影響。
註意:如果你電腦的上述其他目錄存在MySQL配置文件,建議刪除,否則可能會影響MySQL的啟動。

第4步:初始化

>>> "C:\Program Files\mysql-5.7.31-winx64\bin\mysqld.exe"  --initialize-insecure

初始化命令在執行時,會自動讀取配置文件並執行初始化,此過程主要會做兩件事:

  • 自動創建data目錄,以後我們的數據都會存放在這個目錄。
  • 同時創建建必備一些的數據,例如預設賬戶 root (無密碼),用於登錄MySQL並通過指令操作MySQL。

image

在windowns安裝過程中如果有報錯 ( msvcr120.dll不存在 ),請下載並安裝下麵的兩個補丁:

第5步:啟動

啟動MySQL常見的有兩種方式:

  • 臨時啟動

    >>> "C:\Program Files\mysql-5.7.31-winx64\bin\mysqld.exe"
    

    image

    註意:此時程式會掛起,內部就是可以接收客戶端發來的MySQL指令,關閉視窗或Ctrl+c 就可以停止運行。

    這種啟動方式每次開機或想要開啟都需要手動執行一遍命令比較麻煩。

  • 製作windows服務,基於windows服務管理。

    >>>"C:\Program Files\mysql-5.7.31-winx64\bin\mysqld.exe" --install mysql57
    

    image

    創建好服務之後,可以通過命令 啟動和關閉服務,例如:

    >>> net start mysql57
    >>> net stop mysql57
    

    也可以在window的服務管理中點擊按鈕啟動和關閉服務。例如:

    image

    image

    image

    以後不再想要使用window服務了,也可以將製作的這個MySQL服務刪除。

    >>>"C:\Program Files\mysql-5.7.31-winx64\bin\mysqld.exe" --remove mysql57
    

    image

第6步:測試連接MySQL

安裝並啟動MySQL之後,就可以連接MySQL來測試是否已正確安裝並啟動成功。

image

以後在開發時,肯定是要用Python代碼來連接MySQL並且進行數據操作(後面講)。

在安裝MySQL時,其實也自動安裝了一個工具(客戶端),讓我們快速實現連接MySQL併發送指令。
image

註意:如果把bin目錄加入環境變數,每次在運行命令時,就不用再重新輸入絕對路徑了。
image

上述過程如果操作完成之後,證明你的安裝和啟動過程就搞定了。

1.2 mac系統

mac系統和win不同,MySQL為他提供了非常方便的一站式安裝程式,只要點擊、next就可以安裝、初始化完成。

第1步:安裝和初始化

https://downloads.mysql.com/archives/community/

image
image
image

這個基於dmg文件的安裝過程,其實包含了:

  • 安裝,預設安裝在了 /usr/local/mysql-5.7.31-macos10.14-x86_64/目錄。
  • 初始化,在安裝目錄下創建data目錄用於存放數據; 初始化模塊資料庫以及賬戶相關等,例如: 賬cd
    image

第2步:創建配置文件

建議在MySQL安裝目錄下創建 etc/my.cnf 作為MySQL的配置文件。
image

MySQL的配置文件按照優先順序,會在以下目錄中尋找:
image

為了避免多個版本共存時,配置文件混亂的問題,建議大家還是把配置文件放在當前MySQL的安裝目錄下。

第3步:啟動

在Mac系統中啟動MySQL常見的有2種方式:

  • 安裝目錄中自帶 mysql.server 腳本(建議)

    sudo /usr/local/mysql/support-files/mysql.server start
    # 輸入電腦密碼
    
    sudo mysql.server start
    # 輸入電腦密碼
    
    sudo /usr/local/mysql/support-files/mysql.server stop
    

    image

    為了避免每次執行命令都需要些路徑,可以將路徑 /usr/local/mysql/support-files加入到環境變數中。
    image

    操作完成之後,再在終端執行下命令:source ~/.zprofile 讓設置的環境變數立即生效。

    註意:mac系統的版本如果比較老,會顯示空白的 zprofile 文件,此就要去打開 bash_profile 文件。

    這樣設置好之後,以後就可以使用下麵的命令去啟動和關閉MySQL了。

    sudo mysql.server start
    sudo mysql.server stop
    
  • 系統偏好設置(不推薦)
    image

第一種mysql.server腳本的形式,內部是使用 mysqld_safe運行,可以守護我們的MySQL進程,如意外掛掉可自動重啟。

第4步:測試連接MySQL

安裝並啟動MySQL之後,就可以連接MySQL來測試是否已正確安裝並啟動成功。
image
以後在開發時,肯定是要用Python代碼來連接MySQL並且進行數據操作(後面講)。

在安裝MySQL時,其實也自動安裝了一個工具(客戶端),讓我們快速實現連接MySQL併發送指令。
image
image
註意:/usr/local/mysql/bin也可以加入到環境變數。

至此,在Mac系統中關於MySQL的安裝和配置就完成了。

1.3 關於配置文件

上述的過程中,我們在配置文件中只添加了很少的配置。

其實,配置項有很多,而哪些配置項都有預設值,如果我們不配置,MySQL則自動使用預設值。

1.4 關於密碼

1. 設置和修改root密碼

在windows系統中模塊預設 root 賬戶是沒有密碼的,如果想要為賬戶設定密碼,可以在利用root賬戶登錄成功之後,執行:
image

2. 忘記root密碼

如果你忘記了MySQL賬戶的密碼。

  • 修改配置文件,在 [mysqld] 節點下添加 skip-grant-tables=1

    [mysqld]
    ...
    skip-grant-tables=1
    ...
    
  • 重啟MySQL,再次登錄時,不需要密碼直接可以進去了

    • windows重啟

      net stop mysql57
      net start mysql57
      
    • mac重啟

      sudo mysql.server restart
      

    重啟後,無需密碼就可以進入。

    >>> mysql -u root -p
    
  • 進入資料庫後執行修改密碼命令

    use mysql;
    update user set authentication_string = password('新密碼'),password_last_changed=now() where user='root';
    
  • 退出並再次修改配置文件,刪除 [mysqld] 節點下的 skip-grant-tables=1

    [mysqld]
    ...
    # skip-grant-tables=1
    ...
    
  • 再次重啟,以後就可以使用新密碼登錄了。

2. 資料庫 管理

安裝上資料庫之後,就需要開始學習指令了,通過指令讓MySQL去做出一些文件操作。
image
如果將資料庫管理系統與之前的文件管理做類比的話:

資料庫管理系統 文件管理
資料庫 文件夾
數據表 文件夾下的excel文件

接下來,我們先學習 資料庫(文件夾)相關操作的指令。
image

2.1 內置客戶端操作

當連接上MySQL之後,執行如下指令(一般稱為SQL語句),就可以對MySQL的數據進行操作。

  • 查看當前所有的資料庫: show databases;

  • 創建資料庫:create database 資料庫名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

    create database day25db;
    
    create database day25db DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
    
  • 刪除資料庫:drop database 資料庫名;

  • 進入數據(進入文件):use 資料庫;

示例:

# 1.登錄MySQL
wupeiqi@wupeiqideMBP ~ % /usr/local/mysql/bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.31 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

# 2.查看當前資料庫
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

# 3. 創建資料庫:  create database 資料庫名 default charset 編碼 collate 排序規則;
mysql> create database db1 default charset utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

# 4. 刪除資料庫
mysql> drop database db1;
Query OK, 0 rows affected (0.00 sec)

# 5. 查看當前資料庫
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

# 6. 進入資料庫
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
# 7. 進入mysql資料庫(文件夾),查看此資料庫下的所有表。
mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| engine_cost               |
| event                     |
| func                      |
| general_log               |
| gtid_executed             |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| innodb_index_stats        |
| innodb_table_stats        |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| server_cost               |
| servers                   |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
31 rows in set (0.00 sec)

# 8. 退出
mysql>exit;

2.2 Python代碼操作

無論通過何種方式去連接MySQL,本質上發送的 指令 都是相同的,只是連接的方式和操作形式不同而已。

當連接上MySQL之後,執行如下指令,就可以對MySQL的數據進行操作。(同上述過程)

  • 查看當前所有的資料庫 show databases;
  • 創建資料庫:create database 資料庫名 default charset utf8 collate utf8_general_ci;
  • 刪除資料庫:drop database 資料庫名;
  • 進入數據(進入文件):use 資料庫;

想要使用Python操作MySQL需要安裝第三方模塊:

pip3 install pymysql

image

安裝完成後,就可以編寫代碼:

import pymysql

# 連接MySQL(socket)
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8")
cursor = conn.cursor()

# 1. 查看資料庫
# 發送指令
cursor.execute("show databases")
# 獲取指令的結果
result = cursor.fetchall()
print(result) # (('information_schema',), ('mysql',), ('performance_schema',), ('sys',))

# 2. 創建資料庫(新增、刪除、修改)
# 發送指令
cursor.execute("create database db3 default charset utf8 collate utf8_general_ci")
conn.commit()

# 3. 查看資料庫
# 發送指令
cursor.execute("show databases")
# 獲取指令的結果
result = cursor.fetchall()
print(result) # (('information_schema',), ('db3',), ('mysql',), ('performance_schema',), ('sys',))

# 4. 刪除資料庫
# 發送指令
cursor.execute("drop database db3")
conn.commit()

# 3. 查看資料庫
# 發送指令
cursor.execute("show databases")
# 獲取指令的結果
result = cursor.fetchall()
print(result) # (('information_schema',), ('mysql',), ('performance_schema',), ('sys',))

# 5. 進入資料庫,查看表
# 發送指令
cursor.execute("use mysql")
cursor.execute("show tables")
result = cursor.fetchall()
print(result) # (('columns_priv',), ('db',), ('engine_cost',), ('event',), ('func',), ('general_log',),....

# 關閉連接
cursor.close()
conn.close()

3. 數據表 管理

image
如果將資料庫管理系統與之前的文件管理做類比的話:

資料庫管理系統 文件管理
資料庫 文件夾
數據表 文件夾下的文件

接下來,我們先學習 數據表(文件夾中的文件)相關操作的指令。
image

其實在資料庫中創建資料庫 和 創建Excel非常類似,需要指定: 表名列名稱類類型(整型、字元串或其他)

3.1 內置客戶端操作

數據表常見操作的指令:

  • 進入資料庫 use 資料庫;,查看當前所有表:show tables;

  • 創建表結構
    image

    create table 表名(
        列名  類型,
        列名  類型,
        列名  類型
    )default charset=utf8;
    
    create table tb1(
    	id int,
        name varchar(16)
    )default charset=utf8;
    
    create table tb2(
    	id int,
        name varchar(16) not null,   -- 不允許為空
        email varchar(32) null,      -- 允許為空(預設)
        age int
    )default charset=utf8;
    
    create table tb3(
    	id int,
        name varchar(16) not null,   -- 不允許為空
        email varchar(32) null,      -- 允許為空(預設)
        age int default 3            -- 插入數據時,如果不給age列設置值,預設值:3
    )default charset=utf8;
    
    create table tb4(
    	id int primary key,			 -- 主鍵(不允許為空、不能重覆)
        name varchar(16) not null,   -- 不允許為空
        email varchar(32) null,      -- 允許為空(預設)
        age int default 3            -- 插入數據時,如果不給age列設置值,預設值:3
    )default charset=utf8;
    

    主鍵一般用於表示當前這條數據的ID編號(類似於人的身份證),需要我們自己來維護一個不重覆的值,比較繁瑣。所以,在資料庫中一般會將主鍵和自增結合。

    create table tb5(
    	id int not null auto_increment primary key,	-- 不允許為空 & 主鍵 & 自增
        name varchar(16) not null,   		-- 不允許為空
        email varchar(32) null,      		-- 允許為空(預設)
        age int default 3            		-- 插入數據時,如果不給age列設置值,預設值:3
    )default charset=utf8;
    

    註意:一個表中只能有一個自增列【自增列,一般都是主鍵】。

  • 刪除表 drop table 表名;

  • 清空表 delete from 表名;truncate table 表名;(速度快、無法回滾撤銷等)

  • 修改表

    • 添加列

      alter table 表名 add 列名 類型;
      alter table 表名 add 列名 類型 DEFAULT 預設值;
      alter table 表名 add 列名 類型 not null default 預設值;
      alter table 表名 add 列名 類型 not null primary key auto_increment;
      
    • 刪除列

      alter table 表名 drop column 列名;
      
    • 修改列 類型

      alter table 表名 modify column 列名 類型;
      
    • 修改列 類型 + 名稱

      alter table 表名 change 原列名 新列名 新類型;
      
      alter table  tb change id nid int not null;
      alter table  tb change id id int not null default 5;
      alter table  tb change id id int not null primary key auto_increment;
      
      alter table  tb change id id int; -- 允許為空,刪除預設值,刪除自增。
      
    • 修改列 預設值

      ALTER TABLE 表名 ALTER 列名 SET DEFAULT 1000;
      
    • 刪除列 預設值

      ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;
      
    • 添加主鍵

      alter table 表名 add primary key(列名);
      
    • 刪除主鍵

      alter table 表名 drop primary key;
      
  • 常見列類型

    create table 表(
    	id int,
        name varchar(16)
    )default charset=utf8;
    
    • int[(m)][unsigned][zerofill]

      int				表示有符號,取值範圍:-2147483648 ~ 2147483647
      int unsigned	表示無符號,取值範圍:0 ~ 4294967295
      int(5)zerofill	僅用於顯示,當不滿足5位時,按照左邊補0,例如:00002;滿足時,正常顯示。
      
      mysql> create table L1(id int, uid int unsigned, zid int(5) zerofill) default charset=utf8;
      Query OK, 0 rows affected (0.03 sec)
      
      mysql> insert into L1(id,uid,zid) values(1,2,3);
      Query OK, 1 row affected (0.00 sec)
      
      mysql> insert into L1(id,uid,zid) values(2147483641,4294967294,300000);
      Query OK, 1 row affected (0.00 sec)
      
      mysql> select * from L1;
      +------------+------------+--------+
      | id         | uid        | zid    |
      +------------+------------+--------+
      |          1 |          2 |  00003 |
      | 2147483641 | 4294967294 | 300000 |
      +------------+------------+--------+
      2 rows in set (0.00 sec)
      
      mysql> insert into L1(id,uid,zid) values(214748364100,4294967294,300000);
      ERROR 1264 (22003): Out of range value for column 'id' at row 1
      mysql>
      
    • tinyint[(m)] [unsigned] [zerofill]

      有符號,取值範圍:-128 ~ 127.
      無符號,取值範圍:0 ~ 255
      
    • bigint[(m)][unsigned][zerofill]

      有符號,取值範圍:-9223372036854775808 ~ 9223372036854775807
      無符號,取值範圍:0  ~  18446744073709551615
      
    • decimal[(m[,d])] [unsigned] [zerofill]

      準確的小數值,m是數字總個數(負號不算),d是小數點後個數。 m最大值為65,d最大值為30。
      
      例如:
      create table L2(
      	id int not null primary key auto_increment,
      	salary decimal(8,2)
      )default charset=utf8;
      
      mysql> create table L2(id int not null primary key auto_increment,salary decimal(8,2))default charset=utf8;
      Query OK, 0 rows affected (0.03 sec)
      
      mysql> insert into L2(salary) values(1.28);
      Query OK, 1 row affected (0.01 sec)
      
      mysql> insert into L2(salary) values(5.289);
      Query OK, 1 row affected, 1 warning (0.00 sec)
      
      mysql> insert into L2(salary) values(5.282);
      Query OK, 1 row affected, 1 warning (0.00 sec)
      
      mysql> insert into L2(salary) values(512132.28);
      Query OK, 1 row affected (0.00 sec)
      
      mysql> insert into L2(salary) values(512132.283);
      Query OK, 1 row affected, 1 warning (0.00 sec)
      
      mysql> select * from L2;
      +----+-----------+
      | id | salary    |
      +----+-----------+
      |  1 |      1.28 |
      |  2 |      5.29 |
      |  3 |      5.28 |
      |  4 | 512132.28 |
      |  5 | 512132.28 |
      +----+-----------+
      5 rows in set (0.00 sec)
      
      mysql> insert into L2(salary) values(5121321.283);
      ERROR 1264 (22003): Out of range value for column 'salary' at row 1
      mysql>
      
    • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

      單精度浮點數,非準確小數值,m是數字總個數,d是小數點後個數。
      
    • DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

      雙精度浮點數(非準確小數值),m是數字總個數,d是小數點後個數。
      
    • char(m)

      定長字元串,m代表字元串的長度,最多可容納255個字元。
      
      定長的體現:即使內容長度小於m,也會占用m長度。例如:char(5),數據是:yes,底層也會占用5個字元;如果超出m長度限制(預設MySQL是嚴格模式,所以會報錯)。
          如果在配置文件中加入如下配置,
              sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
          保存並重啟,此時MySQL則是非嚴格模式,此時超過長度則自動截斷(不報錯)。。
      
      註意:預設底層存儲是固定的長度(不夠則用空格補齊),但是查詢數據時,會自動將空白去除。 如果想要保留空白,在sql-mode中加入 PAD_CHAR_TO_FULL_LENGTH 即可。
      查看模式sql-mode,執行命令:show variables  like 'sql_mode';
      
      一般適用於:固定長度的內容。
      
      create table L3(
          id int not null primary key auto_increment,
          name varchar(5),
          depart char(3)
      )default charset=utf8;
      
      insert into L3(name,depart) values("alexsb","sbalex");
      
    • varchar(m)

      變長字元串,m代表字元串的長度,最多可容納65535個位元組。
      
      變長的體現:內容小於m時,會按照真實數據長度存儲;如果超出m長度限制((預設MySQL是嚴格模式,所以會報錯)。
          如果在配置文件中加入如下配置,
              sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
          保存並重啟,此時MySQL則是非嚴格模式,此時超過長度則自動截斷(不報錯)。
      
      例如:
      create table L3(
          id int not null primary key auto_increment,
          name varchar(5),
          depart char(3)
      )default charset=utf8;
      
      mysql> create table L3(id int not null primary key auto_increment,name varchar(5),depart char(3))default charset=utf8;
      Query OK, 0 rows affected (0.03 sec)
      
      -- 插入多行
      mysql> insert into L3(name,depart) values("wu","WU"),("wupei","ALS");
      Query OK, 2 rows affected (0.00 sec)
      Records: 2  Duplicates: 0  Warnings: 0
      
      mysql> select * from L3;
      +----+-------+--------+
      | id | name  | depart |
      +----+-------+--------+
      |  1 | wu    | WU     |
      |  2 | wupei | ALS    |
      +----+-------+--------+
      2 rows in set (0.00 sec)
      
      -- 非嚴格模式下,不會報錯。
      mysql> insert into L3(name,depart) values("wupeiqi","ALS");
      ERROR 1406 (22001): Data too long for column 'name' at row 1
      mysql> insert into L3(name,depart) values("wupei","ALSB");
      ERROR 1406 (22001): Data too long for column 'depart' at row 1
      mysql>
      
      -- 如果 sql-mode 中加入了 PAD_CHAR_TO_FULL_LENGTH ,則查詢時char時空白會保留。
      mysql> select name,length(name),depart,length(depart) from L3;
      +-------+--------------+--------+----------------+
      | name  | length(name) | depart | length(depart) |
      +-------+--------------+--------+----------------+
      | wu    |            2 | WU     |              3 |
      | wupei |            5 | ALS    |              3 |
      +-------+--------------+--------+----------------+
      4 rows in set (0.00 sec)
      mysql>
      
    • text

      text數據類型用於保存變長的大字元串,可以組多到65535 (2**16 − 1)個字元。
      
      一般情況下,長文本會用text類型。例如:文章、新聞等。
      
      create table L4(
      	id int not null primary key auto_increment,
          title varchar(128),
      	content text
      )default charset=utf8;
      
    • mediumtext

      A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.
      
    • longtext

      A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1)
      
    • datetime

      YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59)
      
    • timestamp

      YYYY-MM-DD HH:MM:SS(1970-01-01 00:00:00/2037年)
      
      對於TIMESTAMP,它把客戶端插入的時間從當前時區轉化為UTC(世界標準時間)進行存儲,查詢時,將其又轉化為客戶端當前時區進行返回。
      
      對於DATETIME,不做任何改變,原樣輸入和輸出。
      
      mysql> create table L5(
          -> id int not null primary key auto_increment,
          -> dt datetime,
          -> tt timestamp
          -> )default charset=utf8;
      Query OK, 0 rows affected (0.03 sec)
      
      mysql> insert into L5(dt,tt) values("2025-11-11 11:11:44", "2025-11-11 11:11:44");
      
      mysql> select * from L5;
      +----+---------------------+---------------------+
      | id | dt                  | tt                  |
      +----+---------------------+---------------------+
      |  1 | 2025-11-11 11:11:44 | 2025-11-11 11:11:44 |
      +----+---------------------+---------------------+
      1 row in set (0.00 sec)
      
      mysql> show variables like '%time_zone%';
      +------------------+--------+
      | Variable_name    | Value  |
      +------------------+--------+
      | system_time_zone | CST    | 
      | time_zone        | SYSTEM |
      +------------------+--------+
      2 rows in set (0.00 sec)
      -- “CST”指的是MySQL所在主機的系統時間,是中國標準時間的縮寫,China Standard Time UT+8:00
      
      mysql> set time_zone='+0:00';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> show variables like '%time_zone%';
      +------------------+--------+
      | Variable_name    | Value  |
      +------------------+--------+
      | system_time_zone | CST    |
      | time_zone        | +00:00 |
      +------------------+--------+
      2 rows in set (0.01 sec)
      
      mysql> select * from L5;
      +----+---------------------+---------------------+
      | id | dt                  | tt                  |
      +----+---------------------+---------------------+
      |  1 | 2025-11-11 11:11:44 | 2025-11-11 03:11:44 |
      +----+---------------------+---------------------+
      1 row in set (0.00 sec)
      
    • date

      YYYY-MM-DD(1000-01-01/9999-12-31)
      
    • time

      HH:MM:SS('-838:59:59'/'838:59:59')
      

    MySQL還有很多其他的數據類型,例如:set、enum、TinyBlob、Blob、MediumBlob、LongBlob 等,詳細見官方文檔:https://dev.mysql.com/doc/refman/5.7/en/data-types.html

上述就是關於數據表的一些基本操作。

3.2 MySQL代碼操作

基於Python去連接MySQL之後,想要進行數據表的管理的話,發送的指令其實都是相同的,例如:

import pymysql

# 連接MySQL
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8")
cursor = conn.cursor()

# 1. 創建資料庫
"""
cursor.execute("create database db4 default charset utf8 collate utf8_general_ci")
conn.commit()
"""

# 2. 進入資料庫、查看數據表
"""
cursor.execute("use db4")
cursor.execute("show tables")
result = cursor.fetchall()
print(result)
"""

# 3. 進入資料庫創建表
cursor.execute("use db4")
sql = """
create table L4(
    id int not null primary key auto_increment,
    title varchar(128),
    content text,
    ctime datetime
)default charset=utf8;
"""
cursor.execute(sql)
conn.commit()

# 4. 查看資料庫中的表
"""
cursor.execute("show tables")
result = cursor.fetchall()
print(result)
"""

# 5. 其他 drop table... 略過


# 關閉連接
cursor.close()
conn.close()

4.數據行

當資料庫和數據表創建完成之後,就需要對數據表中的內容進行:增、刪、改、查了。
image

4.1 內置客戶端操作

數據行操作的相關SQL語句(指令)如下:

  • 數據

    insert into 表名 (列名,列名,列名) values(對應列的值,對應列的值,對應列的值);
    
    insert into tb1(name,password) values('武沛齊','123123');
    insert into tb1(name,password) values('武沛齊','123123'),('alex','123');
    
    insert into tb1 values('武沛齊','123123'),('alex','123'); -- 如果表中只有2列
    
  • 除數據

    delete from 表名;
    delete from 表名 where 條件;
    
    delete from tb1;
    delete from tb1 where name="wupeiqi";
    delete from tb1 where name="wupeiqi" and password="123";
    delete from tb1 where id>9;
    
  • 數據

    update 表名 set 列名=值;
    update 表名 set 列名=值 where 條件;
    
    update tb1 set name="wupeiqi";
    update tb1 set name="wupeiqi" where id=1;
    
    update tb1 set age=age+1;  -- 整型
    update tb1 set age=age+1 where id=2;
    
    update L3 set name=concat(name,"db");
    update L3 set name=concat(name,"123")  where id=2;  -- concat一個函數,可以拼接字元串
    
  • 詢數據

    select * from 表名;
    select 列名,列名,列名 from 表名;
    select 列名,列名 as 別名,列名 from 表名;
    select * from 表名 where 條件;
    
    select * from tb1;
    select id,name,age from tb1;
    select id,name as N,age, from tb1;
    select id,name as N,age, 111 from tb1;
    
    select * from tb1 where id = 1;
    select * from tb1 where id > 1;
    select * from tb1 where id != 1;
    select * from tb1 where name="wupeiqi" and password="123";
    

4.2 Python代碼操作

image

import pymysql

# 連接MySQL,自動執行 use userdb; -- 進入資料庫
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8", db='userdb')
cursor = conn.cursor()


# 1.新增(需commit)
"""
cursor.execute("insert into tb1(name,password) values('武沛齊','123123')")
conn.commit()
"""

# 2.刪除(需commit)
"""
cursor.execute("delete from tb1 where id=1")
conn.commit()
"""

# 3.修改(需commit)
"""
cursor.execute("update tb1 set name='xx' where id=1")
conn.commit()
"""

# 4.查詢
"""
cursor.execute("select * from tb where id>10")
data = cursor.fetchone() # cursor.fetchall()
print(data)
"""

# 關閉連接
cursor.close()
conn.close()

其實在真正做項目開發時,流程如下:

  • 第一步:根據項目的功能來設計相應的 資料庫 & 表結構(不會經常變動,在項目設計之初就確定好了)。
  • 第二步:操作表結構中的數據,已達到實現業務邏輯的目的。

例如:實現一個 用戶管理系統。

先使用MySQL自帶的客戶端創建相關 資料庫和表結構(相當於先創建好Excel結構)。

create database usersdb default charset utf8 collate utf8_general_ci;
create table users(
    id int not null primary key auto_increment,
    name varchar(32),
    password varchar(64)
)default charset=utf8;

再在程式中執行編寫相應的功能實現 註冊、登錄 等功能。

import pymysql


def register():
    print("用戶註冊")

    user = input("請輸入用戶名:") # alex
    password = input("請輸入密碼:") # sb

    # 連接指定數據
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8", db="usersdb")
    cursor = conn.cursor()

    # 執行SQL語句(有SQL註入風險,稍後講解)
    # sql = 'insert into users(name,password)values("alex","sb")'
    sql = 'insert into users(name,password) values("{}","{}")'.format(user, password)
    
    cursor.execute(sql)
    conn.commit()

    # 關閉資料庫連接
    cursor.close()
    conn.close()

    print("註冊成功,用戶名:{},密碼:{}".format(user, password))


def login():
    print("用戶登錄")

    user = input("請輸入用戶名:")
    password = input("請輸入密碼:")

    # 連接指定數據
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8", db="usersdb")
    cursor = conn.cursor()

    # 執行SQL語句(有SQL註入風險,稍後講解)
    # sql = select * from users where name='wupeiqi' and password='123'
    sql = "select * from users where name='{}' and password='{}'".format(user, password)
    cursor.execute(sql)
    
    result = cursor.fetchone() # 去向mysql獲取結果
    # None
    # (1,wupeiqi,123)
    
    
    # 關閉資料庫連接
    cursor.close()
    conn.close()

    if result:
        print("登錄成功", result)
    else:
        print("登錄失敗")


def run():
    choice = input("1.註冊;2.登錄")
    if choice == '1':
        register()
    elif choice == '2':
        login()
    else:
        print("輸入錯誤")


if __name__ == '__main__':
    run()

So,你會發現, 在項目開發時,資料庫 & 數據表 的操作其實就做那麼一次,最最常寫的還是 對數據行 的操作。

5.關於SQL註入

假如,你開發了一個用戶認證的系統,應該用戶登錄成功後才能正確的返回相應的用戶結果。

import pymysql

# 輸入用戶名和密碼
user = input("請輸入用戶名:") # ' or 1=1 --
pwd = input("請輸入密碼:") # 123


conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8",db='usersdb')
cursor = conn.cursor()

# 基於字元串格式化來 拼接SQL語句
# sql = "select * from users where name='alex' and password='123'"
# sql = "select * from users where name='' or 1=1 -- ' and password='123'"
sql = "select * from users where name='{}' and password='{}'".format(user, pwd)
cursor.execute(sql)

result = cursor.fetchone()
print(result) # None,不是None

cursor.close()
conn.close()

如果用戶在輸入user時,輸入了: ' or 1=1 -- ,這樣即使用戶輸入的密碼不存在,也會可以通過驗證。

為什麼呢?

因為在SQL拼接時,拼接後的結果是:

select * from users where name='' or 1=1 -- ' and password='123'

註意:在MySQL中 -- 表示註釋。

那麼,在Python開發中 如何來避免SQL註入呢?

切記,SQL語句不要在使用python的字元串格式化,而是使用pymysql的execute方法。

import pymysql

# 輸入用戶名和密碼
user = input("請輸入用戶名:")
pwd = input("請輸入密碼:")

conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8", db='userdb')

cursor = conn.cursor()

cursor.execute("select * from users where name=%s and password=%s", [user, pwd])
# 或
# cursor.execute("select * from users where name=%(n1)s and password=%(n2)s", {"n1": user, 'n2': pwd})

result = cursor.fetchone()
print(result)

cursor.close()
conn.close()

總結

image

除了 【第5步 用戶授權】以外,現在使用的是預設root賬戶(擁有最大許可權),上述所有的過程已講解完畢。

本節內容大家需要掌握:

  • 安裝和啟動MySQL
  • SQL語句:
    • 資料庫操作
    • 表操作
    • 數據行操作
  • 基於Python操作MySQL
  • 註意SQL註入的問題

作業

  1. 根據要求 創建表 結構並編寫相應的SQL語句(基於MySQL自帶客戶端操作)

    列名 類型 備註
    id int 不為空 & 自增 & 主鍵
    name varchar(32) 不為空
    password varchar(64) 不為空
    gender char(1) 不為空,支持:男、女
    email varchar(64) 可以為空
    amount decimal(10,2) 不為空 & 預設值為 0
    ctime datetime 新增時的時間
    提示:可基於datetime模塊實現
    • 根據上述表的要求創建相應的數據和表結構(註意編碼)。
create table admin(
  id int not null auto_increment primary key,	-- 不允許為空 & 主鍵 & 自增
  name varchar(32) not null,
  password varchar(64) not null,
  gender char(1) not null,
  email varchar(64) null,
  amount decimal(10,2) not null default 0,
  ctime datetime
)default charset=utf8;
  • 任意插入5條數據。
insert into admin(name,password,gender,email,amount,ctime) values("武沛齊","123123","男","[email protected]",19991.12,NOW());
insert into admin(name,password,gender,email,amount,ctime) values("alex","sb","男","[email protected]",991.12,NOW());
insert into admin(name,password,gender,email,amount,ctime) values("eric","8888","女","[email protected]",991.12,NOW());
insert into admin(name,password,gender,email,amount,ctime) values("tony","123123123","女","[email protected]",200.12,NOW()), ("kelly","8888","女","[email protected]",991.12,NOW());
  • id>3的所有人的性別改為 男。
update admin set gender="男" where id>3;
  • 查詢餘額 amount>1000的所有用戶。
select * from admin where amount>1000;
  • 讓每個人的餘額在自己原的基礎上 +1000 。
update admin set amount=amount+1000;
  • 刪除性別為男的所有數據。
delete from admin where gender="男";
  • 通過Python代碼實現上述除了第一個以外的操作。

    插入5條數據時,ctime那一列不要自己寫“2021-11-11.。。” 而是使用datatime模塊生成當前時間。
    
    import pymysql
    import datetime
    
    # 1.連接資料庫
    conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", password="123456", db="test", charset="utf8")
    cursor = conn.cursor()
    
    # 驗證語句,執行完每次操作都查詢一下
    sql = 'select * from admin;'
    
    # 2.任意插入5條數據。
    insert_sql = 'insert into admin(name,password,gender,email,amount,ctime) values(%s,%s,%s,%s,%s,%s);'
    # 單獨增加一條數據
    cursor.execute(insert_sql, ["武沛齊", "123123", "男", "[email protected]", 19991.12, datetime.datetime.now()])
    conn.commit()
    # 一次性增加多條數據
    cursor.executemany(insert_sql, [
       ["alex", "sb", "男", "[email protected]", 991.12, datetime.datetime.now()],
       ["eric", "8888", "女", "[email protected]", 991.12, datetime.datetime.now()],
       ["tony", "123123123", "女", "[email protected]", 200.12, datetime.datetime.now()],
       ["kelly", "8888", "女", "[email protected]", 991.12, datetime.datetime.now()],
    ])
    conn.commit()
    cursor.execute(sql)
    data = cursor.fetchall()
    print(data)
    
    # 3.將 id>3 的所有人的性別改為  男。
    update_sql = 'update admin set gender="男" where id >3;'
    cursor.execute(update_sql)
    conn.commit()
    cursor.execute(sql)
    data = cursor.fetchall()
    print(data)
    
    # 4.查詢餘額 amount>1000 的所有用戶
    select_sql = 'select * from admin where amount >1000;'
    cursor.execute(select_sql)
    result = cursor.fetchone()
    print(result)
    
    # 5. 讓每個人的餘額在自己原的基礎上 +1000 。
    add_sql = 'update admin set amount=amount+1000;'
    cursor.execute(add_sql)
    conn.commit()
    cursor.execute(sql)
    data = cursor.fetchall()
    print(data)
    
    # 6. 刪除性別為男的所有數據。
    delete_sql = ' delete from admin where gender="男";'
    cursor.execute(delete_sql)
    conn.commit()
    cursor.execute(sql)
    data = cursor.fetchall()
    print(data)
    
    cursor.close()
    conn.close()
    
  1. 編寫腳本實現將 csv 文件的內容錄入到 MySQL 資料庫中。
    要求:自己創建一個自增列作為主鍵(不要用csv文件中的第一列作為主鍵)。

    1715046,河北大學取消考試學生緊急離校,老師:回不了家的到老師家過年,https://video.pearvideo.com/mp4/adshort/20210105/cont-1715046-15562045_adpkg-ad_hd.mp4
    1715020,重慶兩口子因瑣事吵架,男子怒將自家車推進涪江,https://video.pearvideo.com/mp4/adshort/20210105/cont-1715020-15561817_adpkg-ad_hd.mp4
    1715031,成都九峰山因雪景引游客暴增,致垃圾遍地野猴覓食,https://video.pearvideo.com/mp4/adshort/20210105/cont-1715031-15561980_adpkg-ad_hd.mp4
    1715014,女子子宮摘除32年後CT報告稱未見異常,醫生:貼的模版忘刪了,https://video.pearvideo.com/mp4/adshort/20210105/cont-1715014-15561686_adpkg-ad_hd.mp4
    1715025,監控畫面曝光!甘肅天水一公交車與救護車相撞後墜橋,https://video.pearvideo.com/mp4/adshort/20210105/cont-1715025-15561875_adpkg-ad_hd.mp4
    1715010,男子稱退伍後發現被貸款100萬:徵信逾期數十次,非自己簽名,https://video.pearvideo.com/mp4/adshort/20210105/cont-1715010-15561845_adpkg-ad_hd.mp4
    1715007,東北老交警零下43度執勤落下老寒腿:穿2斤重棉褲,已習以為常,https://video.pearvideo.com/mp4/adshort/20210105/cont-1715007-15561958_adpkg-ad_hd.mp4
    1715011,女教師公寓熟睡被同事弟弟連砍數刀:全身刀疤,不敢告訴父母,https://video.pearvideo.com/mp4/adshort/20210105/cont-1715011-15561664_adpkg-ad_hd.mp4
    1714970,網曝江西一村莊現兩千平違建,房主回應:建給村裡當文化中心,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714970-15561752_adpkg-ad_hd.mp4
    1715006,河南一新建足球場內驚現墳墓,官方:會儘快遷墳,https://video.pearvideo.com/mp4/adshort/20210105/cont-1715006-15561679_adpkg-ad_hd.mp4
    1715009,老師收到畢業24年學生送的定製台歷:他高考失利,我開導過,https://video.pearvideo.com/mp4/adshort/20210105/cont-1715009-15561658_adpkg-ad_hd.mp4
    1715000,尚德機構回應未兌現寶馬獎勵:名單仍在確認中,會負責到底,https://video.pearvideo.com/mp4/adshort/20210105/cont-1715000-15561545_adpkg-ad_hd.mp4
    1714993,沈陽重點管控區日常產90噸生活垃圾,重點疫點垃圾由專人運走,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714993-15561434_adpkg-ad_hd.mp4
    1714995,消費者稱遭移動外呼10088套路換套餐,客服致歉:口徑有問題,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714995-1427-174135_adpkg-ad_hd.mp4
    1714979,淚流滿面!武警相隔兩千公裡與妻子隔屏舉行婚禮,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714979-15561542_adpkg-ad_hd.mp4
    1714992,村民結婚兩男子拄拐上門要錢:給少了不走,反問"咋拿得出手",https://video.pearvideo.com/mp4/adshort/20210105/cont-1714992-15561429_adpkg-ad_hd.mp4
    1714457,36年嫌疑人:兒女被罵“殺人犯的孩子”,不想把罵名帶進棺材,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714457-1491-170515_adpkg-ad_hd.mp4
    1714981,男子偷手機被髮現掙脫失主逃跑,執勤輔警狂追八百米擒獲,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714981-99-172939_adpkg-ad_hd.mp4
    1714977,八旬老太撿拾垃圾成癮,堆滿樓道院子漫進鄰居家,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714977-15561306_adpkg-ad_hd.mp4
    1714972,昆明一樓盤消防噴淋離地僅2米1,業主吐槽:直接當噴頭用,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714972-15561247_adpkg-ad_hd.mp4
    1714973,居民家濃煙瀰漫鄰居敲門不應,民警趕來一看是屋主在熏腊肉,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714973-15561249_adpkg-ad_hd.mp4
    1714966,石家莊有超市停業,學校緊急放假,學生:下午考試被臨時取消,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714966-15561248_adpkg-ad_hd.mp4
    1714902,杭州地鐵7號線施工大揭秘:940天完成近40公裡地鐵線,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714902-15561394_adpkg-ad_hd.mp4
    1714928,沈陽已設置重點管控區域,大連志願者挨家挨戶配送生活物資,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714928-15561018_adpkg-ad_hd.mp4
    1714950,女孩考第一溺亡雙胞胎姐姐不吃不喝,家屬訴求:給予心理疏導,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714950-15561100_adpkg-ad_hd.mp4
    1714924,70萬1針特效藥降價,2歲患兒母親哽咽:會拼全力救孩子,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714924-58-162201_adpkg-ad_hd.mp4
    1714930,貴州大叔嫁女陪嫁28萬現金和一套房:兒子結婚只花了十幾萬,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714930-15561017_adpkg-ad_hd.mp4
    1714927,張家口雲頂滑雪場通報一滑雪者摔倒身亡:警方已介入,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714927-15560963_adpkg-ad_hd.mp4
    1714926,邢台全面進入戰時狀態,小區進出需要健康碼,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714926-15560829_adpkg-ad_hd.mp4
    1714918,石家莊多個小區採取封閉管理:發現陽性檢測者,全員核酸檢測,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714918-15560835_adpkg-ad_hd.mp4
    1714693,蘭大女生當兵2年後重返校園:學會自律,珍惜在校時光,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714693-15560791_adpkg-ad_hd.mp4
    1714920,猴哥嘗到投喂甜頭賴老太家不走,逗雞毀菜氣到村民報警,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714920-15560793_adpkg-ad_hd.mp4
    1714916,沈陽確診出車司機搭載的撫順3名乘客全部找到,核酸均為陰性,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714916-15560758_adpkg-ad_hd.mp4
    1714894,轎車被48米建築垃圾圍堵三個月,車主無法用車叫苦不迭,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714894-15560731_adpkg-ad_hd.mp4
    1714861,考第一被質疑後溺亡女孩同學:她自尊心強,曾說被懷疑作弊,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714861-15560701_adpkg-ad_hd.mp4
    1714886,東北漢子衝進火場救人被熏成黑臉:差幾秒,我就倒在裡面了,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714886-15560659_adpkg-ad_hd.mp4
    1714908,探訪石家莊疫情高風險地區:部分村莊封村,外村人一律不讓進,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714908-15560638_adpkg-ad_hd.mp4
    1714906,“北京時間”產生於西安,科學家解讀選址考量因素,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714906-15560549_adpkg-ad_hd.mp4
    1714907,16人聚餐吃了800元無人結賬,老闆詢問反遭懟:多大點事兒,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714907-15560637_adpkg-ad_hd.mp4
    1714892,重慶一地鐵站出口建在坡頂,居民:期待未來的變化,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714892-15560550_adpkg-ad_hd.mp4
    1714900,河北南宮一小區發現高度疑似密接人員,小區全面封閉只進不出,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714900-15560548_adpkg-ad_hd.mp4
    1714901,杭州運河邊8平米小書攤開了13年,店主兼職拉貨補貼,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714901-15560544_adpkg-ad_hd.mp4
    1714877,河南商丘鸚鵡賣家被追刑責,養殖戶:不敢賣不敢放,放也犯法,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714877-15560499_adpkg-ad_hd.mp4
    1714895,石家莊小果莊村1天增加8例確診病例,為全國唯一高風險地區,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714895-15560459_adpkg-ad_hd.mp4
    1714801,48歲女教師重新高考學法律:直接進入老年生活是種損失,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714801-15560352_adpkg-ad_hd.mp4
    1714873,不認失散聾啞兒夫妻已接走兒子,養父:兩驗DNA,歸屬沒說清,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714873-15560356_adpkg-ad_hd.mp4
    1714846,7歲男童煤氣中毒腦死亡,父母含淚為其捐器官救同齡人,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714846-15560326_adpkg-ad_hd.mp4
    1714875,連夜出發!衡水110名護士緊急集結支援中風險地區,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714875-15560268_adpkg-ad_hd.mp4
    1713843,打滿全場丨院感專家李素英回憶援鄂:90後00後醫護最讓我感動,https://video.pearvideo.com/mp4/adshort/20210104/cont-1713843-15559433_adpkg-ad_hd.mp4
    1714869,河北新增14例確診30例無癥狀,石家莊一村莊調整為高風險地區,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714869-15560218_adpkg-ad_hd.mp4
    1714862,應急部披露襄汾飯店坍塌致29死細節:8次違規擴建,監管不嚴,https://video.pearvideo.com/mp4/adshort/20210105/cont-1714862-15560157_adpkg-ad_hd.mp4
    

    創建表的語句:

    create table news(
       id int not null auto_increment primary key,
       news_id int not null,
       news_title varchar(255),
       news_url varchar(255)
    )default charset=utf8;
    
    import pymysql
    
     # 1.連接資料庫
     conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", password="123456", db="test", charset="utf8")
     cursor = conn.cursor()
    
     sql = 'insert into news(news_id, news_title, news_url) values (%s,%s,%s)'
    
     # 2. 讀取news.csv中的數據並插入news表
     with open("news.csv", mode="r", encoding="utf-8") as file_object:
     	for line in file_object:
     		# 由於新聞標題中會帶有逗號,故先將news_id分割出來
     		news_id, news_title_url = line.split(",", maxsplit=1)
     		# 從右邊開始根據逗號分隔,因為url中是不會帶逗號的
     		news_title = news_title_url.rsplit(",")[0]
     		news_url = news_title_url.rsplit(",")[1]
     		cursor.execute(sql, [news_id, news_title, news_url])
     		conn.commit()
    
     cursor.execute('select * from news;')
     res = cursor.fetchall()
     print(res)
    
     cursor.close()
     conn.close()
    

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 實驗要求一:對比分析 對比分析墨刀、Axure、Mockplus等原型設計工具的各自的適用領域及優缺點。 一丶墨刀 墨刀是一款線上的產品設計協作軟體,可以解決產設研團隊中存在的項目管理許可權不明、版本管理混亂、協作低效等諸多問題。 優點: 功能強大:可滿足產品經理、設計師、開發在產品設計和團隊協作上的 ...
  • title: 文本語音互相轉換系統設計 date: 2024/4/24 21:26:15 updated: 2024/4/24 21:26:15 tags: 需求分析 模塊化設計 性能優化 系統安全 智能化 跨平臺 區塊鏈 第一部分:導論 第一章:背景與意義 文本語音互相轉換系統的定義與作用 文本語 ...
  • 參考:https://www.cnblogs.com/mc-74120/p/13622008.html pom文件 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> </dependency> 啟動 ...
  • 新手下載python和anaconda3要註意哪些 1、python 關於python下載其實很簡單,直接在官網下載就行。 官網:Welcome to Python.org 當然,到了官網下載是預設最新版本,如果你需要舊版本,那就需要找一下了,這裡提供一下windows的各版本的官網鏈接: Pyth ...
  • 來源:https://www.cnblogs.com/405845829qq/p/7552736.html 前言 公司最近在搞服務分離,數據切分方面的東西,因為單張包裹表的數據量實在是太大,並且還在以每天60W的量增長。 之前瞭解過資料庫的分庫分表,讀過幾篇博文,但就只知道個模糊概念, 而且現在回想 ...
  • 大家好,我是 Java陳序員。 我們無論是日常生活還是辦公,常常需要使用一些工具軟體來記錄筆記、代辦事項等。 今天,給大家介紹一款支持私有化部署、支持多端使用的筆記軟體。 關註微信公眾號:【Java陳序員】,獲取開源項目分享、AI副業分享、超200本經典電腦電子書籍等。 項目介紹 Blossom ...
  • 手寫 SpringMVC 底層機制 前景提要:實現的是SpringMVC核心機制 對一些細枝末節的代碼做了簡化,比如字元串的處理... 完成哪些機制 機制一: 通過@RequestMapping ,可以標記一個方法,編寫路徑url,瀏覽器就能通過url完成調用 機制二: 進行依賴註入,使之不需要傳統 ...
  • SpringMVC筆記 SpringMVC介紹 基本介紹 SpringMVC 是WEB 層框架, 接管了Web 層組件, 支持MVC 的開發模式/開發架構 SpringMVC 通過註解,讓POJO 成為控制器,不需要繼承類或者實現介面 SpringMVC 採用低耦合的組件設計方式,具有更好擴展和靈活 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...