目錄
一、數據庫操作
1、創建
1-1、用mysql-connector-python庫
1-2、用PyMySQL庫
1-3、用PeeWee庫
1-4、用SQLAlchemy庫
2、刪除
2-1、用mysql-connector-python庫
2-2、用PyMySQL庫
2-3、用PeeWee庫
2-4、用SQLAlchemy庫
二、數據表操作
1、創建
1-1、用mysql-connector-python庫
1-2、用PyMySQL庫
1-3、用PeeWee庫
1-4、用SQLAlchemy庫
2、刪除
2-1、用mysql-connector-python庫
2-2、用PyMySQL庫
2-3、用PeeWee庫
2-4、用SQLAlchemy庫
三、推薦閱讀
1、Python函數之旅
2、Python算法之旅
3、博客個人主頁
???????
一、數據庫操作
1、創建
????????現需在MySQL服務器上新建數據庫test_database;同時,在新建的數據test_database中創建數據表test_table。不管是數據庫,還是數據表,若不存在,則新建。
1-1、用mysql-connector-python庫
import mysql.connector
# 配置數據庫連接信息
config = {'user': 'root','password': '123456', # 在此輸入你的MySQL密碼,請自行修改'host': '127.0.0.1','database': 'mysql' # 如果要指定數據庫
}
# 連接到MySQL服務器
try:cnx = mysql.connector.connect(**config)cursor = cnx.cursor()# 創建新數據庫test_database(如果不存在)create_db_query = "CREATE DATABASE IF NOT EXISTS test_database"cursor.execute(create_db_query)# 切換到新數據庫use_db_query = "USE test_database"cursor.execute(use_db_query)# 創建新表test_table(如果不存在)# 假設我們有一個簡單的表,包含 id(整數,主鍵,自增)、name(字符串)和 age(整數)create_table_query = """ CREATE TABLE IF NOT EXISTS test_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, age INT ) """cursor.execute(create_table_query)# 提交事務cnx.commit()
except mysql.connector.Error as err:print(f"Error: {err}")if cnx.is_connected():cnx.rollback() # 如果需要回滾事務的話
finally:# 關閉游標和連接if cursor:cursor.close()if cnx.is_connected():cnx.close()
1-2、用PyMySQL庫
import pymysql
# 配置數據庫連接信息
config = {'user': 'root','password': '123456', # 在此輸入你的MySQL密碼,請自行修改'host': '127.0.0.1','database': 'mysql' # 如果要指定數據庫,但這里我們稍后會創建新數據庫
}
# 連接到MySQL服務器
try:# 注意:PyMySQL沒有直接使用**config的方式,需要分別傳入參數cnx = pymysql.connect(host=config['host'],user=config['user'],password=config['password'],charset='utf8mb4', # 可選,添加字符集支持cursorclass=pymysql.cursors.DictCursor) # 使用字典游標# 創建新數據庫test_database(如果不存在)with cnx.cursor() as cursor:create_db_query = "CREATE DATABASE IF NOT EXISTS test_database"cursor.execute(create_db_query)# 切換到新數據庫# 注意:PyMySQL沒有直接的USE語句,我們需要斷開連接并重新連接到新數據庫cnx.close()config['database'] = 'test_database'cnx = pymysql.connect(**config, charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)# 創建新表test_table(如果不存在)# 假設我們有一個簡單的表,包含 id(整數,主鍵,自增)、name(字符串)和 age(整數)with cnx.cursor() as cursor:create_table_query = """ CREATE TABLE IF NOT EXISTS test_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, age INT ) """cursor.execute(create_table_query)# 提交事務cnx.commit()
except pymysql.MySQLError as err:print(f"Error: {err}")if cnx:cnx.rollback() # 如果需要回滾事務的話(但對于DDL語句,通常沒有回滾的必要)
finally:# 關閉游標和連接if cnx:cnx.close()
1-3、用PeeWee庫
from peewee import *
# 配置數據庫連接信息,這里嘗試連接到名為'mysql'的數據庫
db = MySQLDatabase('mysql', user='root', password='123456', host='127.0.0.1')
# 嘗試連接數據庫
try:db.connect()# 創建新數據庫test_database(如果不存在),這里通過執行原始SQL語句來實現db.execute_sql("CREATE DATABASE IF NOT EXISTS test_database")# 更改數據庫連接對象以連接到新創建的數據庫(或已存在的)db = MySQLDatabase('test_database', user='root', password='123456', host='127.0.0.1')db.connect()# 定義模型(對應于數據庫表)class TestTable(Model):id = AutoField() # 自增主鍵name = CharField(null=False) # 字符字段,不能為空age = IntegerField(null=True) # 整數字段,可以為空class Meta:database = db # 指定該模型使用的數據庫連接# 自定義的創建表方法,這里實際上是覆蓋了基類Model的create_table方法# 但實際上這里不需要重新定義,因為Peewee會自動在調用create_table時處理提交事務def create_table(cls, fail_silently=False, **options):super(TestTable, cls).create_table(fail_silently, **options)db.commit() # 這里提交事務其實是不必要的,因為Peewee默認會處理# 調用自定義的create_table方法來創建表(如果不存在)# 但通常我們會直接調用 TestTable.create_table() 而無需修改它TestTable.create_table()
except Exception as e:print(f"Error: {e}")# 如果連接已關閉,這里的關閉操作是多余的,因為db.close()在連接關閉時不會引發錯誤if db.is_closed():db.close() # 實際上,這里的檢查是多余的,因為db在異常發生前應該是打開的else:db.rollback() # 如果有事務在執行并且需要回滾的話(但在這個場景中,通常沒有顯式開啟的事務)
finally:# 無論是否發生異常,都要確保數據庫連接被關閉if not db.is_closed():db.close()
1-4、用SQLAlchemy庫
略,該庫本身不支持直接創建數據庫,需要借助其他第三方庫,如PyMySQL
2、刪除
????????現需在MySQL服務器上刪除已有數據庫test_database,以下為借助第三方庫實現:
2-1、用mysql-connector-python庫
import mysql.connector
# MySQL服務器連接參數
config = {'user': 'root','password': '123456', # 在此輸入你的MySQL密碼,請自行修改'host': '127.0.0.1','database': 'mysql' # 如果要指定數據庫
}
# 連接到MySQL服務器
try:connection = mysql.connector.connect(**config)cursor = connection.cursor()# 執行SQL語句來刪除test_database數據庫sql = "DROP DATABASE IF EXISTS test_database"cursor.execute(sql)# 提交事務connection.commit()print("Database test_database deleted successfully.")
except mysql.connector.Error as error:print(f"Error: '{error}'")
finally:# 關閉游標和連接if connection.is_connected():cursor.close()connection.close()
2-2、用PyMySQL庫
import pymysql
# MySQL服務器連接參數
config = {'user': 'root', # 替換為你的MySQL用戶名'password': '123456', # 替換為你的MySQL密碼'host': '127.0.0.1', # 替換為你的MySQL服務器地址'port': 3306, # 如果你的MySQL不是默認端口,需要指定'charset': 'utf8mb4', # 設置字符集'cursorclass': pymysql.cursors.DictCursor # 使用字典游標,這不是必需的
}
# 連接到MySQL服務器(注意這里我們沒有指定database參數)
try:# 因為我們要刪除數據庫,所以不需要連接到特定的數據庫connection = pymysql.connect(**{k: v for k, v in config.items() if k != 'database'})with connection.cursor() as cursor:# 執行SQL語句來刪除test_database數據庫sql = "DROP DATABASE IF EXISTS test_database"cursor.execute(sql)# 提交事務,可省略connection.commit()print("Database test_database deleted successfully.")
except pymysql.MySQLError as error:print(f"Error: '{error}'")
finally:# 關閉連接if connection:connection.close()
2-3、用PeeWee庫
略,該庫本身不支持直接刪除數據庫,需要借助其他第三方庫,如PyMySQL
2-4、用SQLAlchemy庫
略,該庫本身不支持直接刪除數據庫,需要借助其他第三方庫,如PyMySQL
二、數據表操作
1、創建
????????在MySQL服務器上已有數據庫test_database,需在該數據庫中創建數據表myelsa_table,以下為借助第三方庫實現:
1-1、用mysql-connector-python庫
import mysql.connector
# 數據庫連接配置
config = {'user': 'root', # 替換為你的MySQL用戶名'password': '123456', # 替換為你的MySQL密碼'host': '127.0.0.1', # 如果數據庫在遠程服務器上,請替換為相應的主機名或IP地址'database': 'test_database', # 數據庫名'raise_on_warnings': True
}
# 連接到數據庫
cnx = mysql.connector.connect(**config)
cursor = cnx.cursor()
# 創建數據表的SQL語句
create_table_query = """
CREATE TABLE IF NOT EXISTS myelsa_table ( name VARCHAR(255) NOT NULL, ID_Card VARCHAR(255) NOT NULL, age INT NOT NULL, city VARCHAR(255) NOT NULL, PRIMARY KEY (ID_Card) -- 如果ID_Card字段是唯一的,可以設為主鍵,否則可以移除這行
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
"""
# 執行SQL語句
cursor.execute(create_table_query)
# 提交更改(如果使用了事務)
cnx.commit()
# 關閉連接
cursor.close()
cnx.close()
print("Table myelsa_table created successfully!")
1-2、用PyMySQL庫
import pymysql
# 數據庫連接配置
config = {'user': 'root', # 替換為你的MySQL用戶名'password': '123456', # 替換為你的MySQL密碼'host': '127.0.0.1', # 如果數據庫在遠程服務器上,請替換為相應的主機名或IP地址'database': 'test_database', # 數據庫名'charset': 'utf8mb4', # 字符集設置'cursorclass': pymysql.cursors.DictCursor # 使用字典游標
}
# 連接到數據庫
connection = pymysql.connect(**config)
try:with connection.cursor() as cursor:# 創建數據表的SQL語句create_table_query = """ CREATE TABLE IF NOT EXISTS myelsa_table ( name VARCHAR(255) NOT NULL, ID_Card VARCHAR(255) NOT NULL, age INT NOT NULL, city VARCHAR(255) NOT NULL, PRIMARY KEY (ID_Card) -- 如果ID_Card字段是唯一的,可以設為主鍵 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; """# 執行SQL語句cursor.execute(create_table_query)# 提交更改(對于自動提交模式,這一步可能不是必須的)connection.commit()
finally:connection.close()print("Table myelsa_table created successfully!")
1-3、用PeeWee庫
from peewee import *
# 數據庫連接配置
db = MySQLDatabase('test_database', user='root', password='123456', host='127.0.0.1')
# 定義模型
class MyElsaTable(Model):name = CharField(max_length=255, null=False)ID_Card = CharField(max_length=255, unique=True) # 假設ID_Card是唯一的age = IntegerField(null=False)city = CharField(max_length=255, null=False)class Meta:database = db
# 連接到數據庫
db.connect()
# 創建表(如果表不存在)
db.create_tables([MyElsaTable])
# 關閉數據庫連接(在 Peewee 中,通常不需要顯式關閉連接,因為它會自動管理連接池)
db.close()
print("Table myelsa_table created successfully!")
1-4、用SQLAlchemy庫
from sqlalchemy import create_engine, Column, Integer, String, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 數據庫連接配置(使用 SQLAlchemy 的 URI 格式)
DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1/test_database?charset=utf8mb4'
# 創建一個引擎實例
engine = create_engine(DATABASE_URI, echo=True) # echo=True 用于顯示生成的 SQL 語句,調試時可以打開
# 創建基類
Base = declarative_base()
# 定義模型類
class MyElsaTable(Base):__tablename__ = 'myelsa_table'name = Column(String(255), nullable=False)ID_Card = Column(String(255), primary_key=True) # 設置為主鍵age = Column(Integer, nullable=False)city = Column(String(255), nullable=False)
# 創建表(如果表不存在)
Base.metadata.create_all(engine)
# 如果你想要使用 ORM 來進行操作,可以創建一個 session 類
Session = sessionmaker(bind=engine)
session = Session()
# 這里不需要執行 SQL 語句或提交更改,因為 create_all 方法會自動處理
# 關閉 session(如果需要的話,但在這種情況下我們并沒有進行任何 ORM 操作)
# session.close()
print("Table myelsa_table created successfully!")
2、刪除
????????在MySQL服務器上已有數據庫test_database,且該數據庫下已有數據表myelsa_table,現需刪除數據表myelsa_table,以下為借助第三方庫實現:
2-1、用mysql-connector-python庫
import mysql.connector
# 數據庫連接配置
config = {'user': 'root', # 替換為你的MySQL用戶名'password': '123456', # 替換為你的MySQL密碼'host': '127.0.0.1', # 如果數據庫在遠程服務器上,請替換為相應的主機名或IP地址'database': 'test_database', # 數據庫名
}
try:# 連接到數據庫cnx = mysql.connector.connect(**config)cursor = cnx.cursor()# 執行SQL語句來刪除表drop_table_query = "DROP TABLE IF EXISTS myelsa_table;"cursor.execute(drop_table_query)# 提交更改(在這個例子中,刪除表不需要顯式提交,因為不是事務的一部分)# 但如果你之前做了其他更改,這里可以調用cnx.commit()print("Table myelsa_table deleted successfully!")
except mysql.connector.Error as err:print(f"Error: '{err}'")
finally:# 關閉游標和連接if cursor:cursor.close()if cnx.is_connected():cnx.close()
2-2、用PyMySQL庫
import pymysql
# 數據庫連接配置
config = {'user': 'root', # 替換為你的MySQL用戶名'password': '123456', # 替換為你的MySQL密碼'host': '127.0.0.1', # 如果數據庫在遠程服務器上,請替換為相應的主機名或IP地址'database': 'test_database', # 數據庫名'charset': 'utf8mb4', # 設置字符集,可選'cursorclass': pymysql.cursors.DictCursor # 使用字典游標,可選
}
try:# 連接到數據庫connection = pymysql.connect(**config)with connection.cursor() as cursor:# 執行SQL語句來刪除表drop_table_query = "DROP TABLE IF EXISTS myelsa_table;"cursor.execute(drop_table_query)# 提交更改(在這個例子中,刪除表不需要顯式提交,因為不是事務的一部分)# 但如果你之前做了其他更改,并且它們是在一個事務中,這里可以調用 connection.commit()print("Table myelsa_table deleted successfully!")
except pymysql.MySQLError as err:print(f"Error: '{err}'")
finally:# 關閉連接if connection.open:connection.close()
2-3、用PeeWee庫
# 注意,這里需要借助擴展庫peewee-mysql,需提前安裝
from peewee import *
# 數據庫連接配置
db = MySQLDatabase('test_database',user='root',password='123456',host='127.0.0.1'
)
try:# 連接到數據庫 db.connect()# 創建一個用于執行原始 SQL 的游標 db.execute_sql("DROP TABLE IF EXISTS myelsa_table;")# Peewee 沒有直接的“提交”操作,因為對于 DDL(數據定義語言)語句如 DROP TABLE, # 它們通常是立即執行的,不需要事務提交。 print("Table myelsa_table deleted successfully!")
except peewee.OperationalError as e:print(f"Error: '{e}'")
finally:# 關閉數據庫連接 db.close()
2-4、用SQLAlchemy庫
from sqlalchemy import create_engine, MetaData, Table
# 數據庫連接配置
config = {'user': 'root', # 替換為你的MySQL用戶名'password': '123456', # 替換為你的MySQL密碼'host': '127.0.0.1', # 如果數據庫在遠程服務器上,請替換為相應的主機名或IP地址'database': 'test_database', # 數據庫名'dialect': 'mysql' # 使用mysql方言
}
# 創建連接字符串
connection_string = f"{config['dialect']}+pymysql://{config['user']}:{config['password']}@{config['host']}/{config['database']}"
try:# 創建引擎engine = create_engine(connection_string)# 使用引擎連接到數據庫with engine.connect() as conn:# 創建元數據對象metadata = MetaData()# 定義要刪除的表(如果已知表結構,可以創建完整的 Table 對象)# 但為了簡單地刪除表,我們只需要表名table_name = 'myelsa_table'# 使用 SQLAlchemy 的反射機制來獲取 Table 對象(如果需要)# 這里我們直接執行原始 SQL 語句來刪除表# 執行SQL語句來刪除表drop_table_query = f"DROP TABLE IF EXISTS {table_name};"conn.execute(drop_table_query)print("Table myelsa_table deleted successfully!")
except Exception as e:print(f"Error: '{e}'")# 在 with 語句結束后,連接會自動關閉,所以不需要顯式關閉連接