国产精品亚洲成在人线_中文字幕在线最新在线不卡_日本欧美一区二区三区乱码_亚洲福利一区二区

9000px;">
  • <menu id="esycg"><strong id="esycg"></strong></menu>
  • <input id="esycg"></input>

    當(dāng)前位置 主頁 > 技術(shù)大全 >

      告別SQL注入:詳解Python中MySQL參數(shù)化查詢的正確使用方法

      欄目:技術(shù)大全 時間:2025-09-24 21:10

      ‍今天詳細(xì)講解一下在 Python 中連接 MySQL 數(shù)據(jù)庫的幾種主流方法。這將是一個從基礎(chǔ)到進(jìn)階的完整指南。
      核心庫選擇
      在 Python 中連接 MySQL,主要有兩個流行的驅(qū)動:
      1. mysql-connector-python: MySQL 官方提供的純 Python 驅(qū)動。無需其他依賴,安裝簡單。
      2. PyMySQL: 一個純 Python 的 MySQL 客戶端,兼容性很好,非常流行。
      3. (底層驅(qū)動) MySQLdb: 一個 C 擴(kuò)展模塊,速度很快,但在 Python 3 上安裝可能較麻煩,通常被 PyMySQL 替代。
      對于現(xiàn)代項(xiàng)目,PyMySQL 和 mysql-connector-python 是最常見的選擇。本指南將以 `PyMySQL` 和 `SQLAlchemy` 為例。
      方法一:使用 PyMySQL 直接連接(基礎(chǔ)方法)
      這種方式提供了最直接的 SQL 操作,適合需要完全控制 SQL 語句的場景。
      1. 安裝庫
       
      ```bash
      pip install pymysql
      ```
       
      2. 基本連接與操作流程
       
      完整的操作流程遵循 連接 -> 創(chuàng)建游標(biāo) -> 執(zhí)行SQL -> 提交 -> 關(guān)閉 的步驟。
       
      ```python
      import pymysql
      from pymysql.cursors import DictCursor 可選,用于獲取字典格式的結(jié)果
       
      1. 建立數(shù)據(jù)庫連接
      connection = pymysql.connect(
      host='localhost', 數(shù)據(jù)庫服務(wù)器地址,本地可用 localhost 或 127.0.0.1
      user='your_username', 用戶名
      password='your_password', 密碼
      database='your_database_name', 要連接的數(shù)據(jù)庫名
      charset='utf8mb4', 字符集,支持中文和表情符號推薦 utf8mb4
      cursorclass=DictCursor 可選:設(shè)置游標(biāo)類型,返回字典而非元組
      )
       
      try:
      2. 創(chuàng)建一個游標(biāo)對象,用于執(zhí)行SQL語句
      with connection.cursor() as cursor:
      示例1: 執(zhí)行一條 SELECT 查詢
      sql = "SELECT `id`, `name` FROM `users` WHERE `email` = %s"
      cursor.execute(sql, ('user@example.com',)) 使用參數(shù)化查詢,防止SQL注入!
      獲取結(jié)果
      result = cursor.fetchone() 獲取單條記錄
      print(result) 如果是DictCursor,輸出: {'id': 1, 'name': 'John'}
      如果用默認(rèn)游標(biāo),輸出: (1, 'John')
      獲取所有記錄
      results = cursor.fetchall()
      for row in results:
      print(row)
       
      示例2: 執(zhí)行一條 INSERT 語句
      with connection.cursor() as cursor:
      sql = "INSERT INTO `users` (`name`, `email`) VALUES (%s, %s)"
      cursor.execute(sql, ('Alice', 'alice@example.com'))
      3. 提交事務(wù)!對于INSERT/UPDATE/DELETE等寫操作,必須提交才會生效。
      connection.commit()
       
      示例3: 獲取剛插入數(shù)據(jù)的主鍵ID
      with connection.cursor() as cursor:
      sql = "INSERT INTO `users` (`name`, `email`) VALUES (%s, %s)"
      cursor.execute(sql, ('Bob', 'bob@example.com'))
      connection.commit()
      print(f"新插入記錄的ID是: {cursor.lastrowid}")
       
      finally:
      4. 關(guān)閉連接,釋放資源
      connection.close()
      ```
       
      3. 使用上下文管理器 (推薦)
       
      為了確保連接總是能被正確關(guān)閉,即使發(fā)生異常,推薦使用 `with` 語句。
       
      ```python
      import pymysql
       
      使用 with 語句自動管理連接和游標(biāo)的關(guān)閉
      try:
      with pymysql.connect(host='localhost', user='root', password='password', database='test') as conn:
      with conn.cursor() as cursor:
      cursor.execute("SELECT VERSION()")
      result = cursor.fetchone()
      print(f"Database version: {result[0]}")
      連接結(jié)束時,如果沒有異常,會自動 commit(); 如果有異常,會自動 rollback()
      except pymysql.Error as e:
      print(f"Database error: {e}")
      ```
       
       
       
      方法二:使用 SQLAlchemy (ORM 框架,進(jìn)階方法)
       
      ORM (Object-Relational Mapping) 允許你使用 Python 類和對象來操作數(shù)據(jù)庫,而不是直接寫 SQL。這對于大型、復(fù)雜的項(xiàng)目非常有益,可以提高開發(fā)效率和代碼可維護(hù)性。
       
      1. 安裝
       
      ```bash
      pip install sqlalchemy pymysql
      ```
       
      2. 核心組件與連接
       
      ```python
      from sqlalchemy import create_engine, Column, Integer, String
      from sqlalchemy.ext.declarative import declarative_base
      from sqlalchemy.orm import sessionmaker
       
      1. 定義數(shù)據(jù)庫連接字符串
      格式: dialect+driver://username:password@host:port/database
      DB_URI = 'mysql+pymysql://username:password@localhost:3306/your_database?charset=utf8mb4'
       
      2. 創(chuàng)建引擎 (Engine),它是ORM和數(shù)據(jù)庫的連接核心
      engine = create_engine(DB_URI, echo=True) echo=True 會打印執(zhí)行的SQL,調(diào)試時有用
       
      3. 創(chuàng)建基類
      Base = declarative_base()
       
      4. 定義映射類(模型)
      class User(Base):
      __tablename__ = 'users' 指定映射的表名
       
      id = Column(Integer, primary_key=True, autoincrement=True)
      name = Column(String(50), nullable=False)
      email = Column(String(100), unique=True)
       
      5. 創(chuàng)建所有表(如果不存在)
      Base.metadata.create_all(engine)
       
      6. 創(chuàng)建會話工廠 (Session)
      Session = sessionmaker(bind=engine)
       
      7. 使用會話進(jìn)行增刪改查
      新增數(shù)據(jù)
      with Session() as session:
      new_user = User(name='Charlie', email='charlie@example.com')
      session.add(new_user)
      session.commit() 提交事務(wù)
      print(f"New user ID: {new_user.id}") 提交后,id自動賦值
       
      查詢數(shù)據(jù)
      with Session() as session:
      查詢所有用戶
      users = session.query(User).all()
      for user in users:
      print(user.id, user.name, user.email)
       
      條件查詢
      user = session.query(User).filter_by(name='Charlie').first()
      if user:
      print(f"Found user: {user.name}")
      ```
       
       
       
      最佳實(shí)踐與重要提示
       
      1. 安全第一:永遠(yuǎn)使用參數(shù)化查詢
      錯誤做法(SQL注入風(fēng)險): `cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'")`
      正確做法: `cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))`
      PyMySQL 使用 `%s` 作為占位符,即使數(shù)據(jù)是數(shù)字或日期。
       
      2. 管理敏感信息
      切勿將數(shù)據(jù)庫密碼等硬編碼在代碼中!
      使用環(huán)境變量或配置文件(如 `.env` 文件)來管理。
      示例(使用 `python-dotenv`):
      ```bash
      pip install python-dotenv
      ```
      ```python
      .env 文件
      DB_HOST=localhost
      DB_USER=root
      DB_PASSWORD=your_secure_password
      DB_NAME=my_app
      ```
      ```python
      app.py
      from dotenv import load_dotenv
      import os
      import pymysql
       
      load_dotenv() 加載 .env 文件中的環(huán)境變量
       
      connection = pymysql.connect(
      host=os.getenv('DB_HOST'),
      user=os.getenv('DB_USER'),
      password=os.getenv('DB_PASSWORD'),
      database=os.getenv('DB_NAME')
      )
      ```
       
      3. 連接管理
      數(shù)據(jù)庫連接是昂貴的資源,一定要確保在使用后正確關(guān)閉。強(qiáng)烈推薦使用 `with` 語句上下文管理器。
       
      4. 選擇策略
      簡單腳本、需要精細(xì)控制SQL:選擇 PyMySQL 或 mysql-connector-python。
      Web應(yīng)用、復(fù)雜業(yè)務(wù)邏輯、希望代碼更Pythonic:選擇 SQLAlchemy ORM。
      另外搭配便捷的MYSQL備份工具,可定時備份、異地備份,MYSQL導(dǎo)出導(dǎo)入。可本地連接LINUX里的MYSQL,簡單便捷。可以大大地提高工作效率喔。

    MySQL鎖表會影響你的備份操作嗎?
    探索MySQL引擎?先掌握其備份恢復(fù)原理!
    mysql怎么安裝,MySQL安裝完畢怎樣設(shè)置自動備份才省心?
    MySQL 全連接(FULL OUTER JOIN)完全指南:語法、誤區(qū)與 UNION 實(shí)現(xiàn)方案
    MySQL刪除數(shù)據(jù)詳解:DELETE與TRUNCATE的原理、區(qū)別與正確選用
    MySQL UPDATE語句詳解:從基礎(chǔ)語法到多表連接更新實(shí)戰(zhàn)
    從備份到驗(yàn)證:MySQL表字段刪除操作的標(biāo)準(zhǔn)化流程與最佳實(shí)踐
    MySQL分頁查詢詳解:從LIMIT/OFFSET基礎(chǔ)到鍵集分頁性能優(yōu)化實(shí)戰(zhàn)
    告別SQL注入:詳解Python中MySQL參數(shù)化查詢的正確使用方法
    MySQL 表結(jié)構(gòu)升級:ALTER TABLE ADD COLUMN 語法詳解與最佳實(shí)踐
    国产精品亚洲成在人线_中文字幕在线最新在线不卡_日本欧美一区二区三区乱码_亚洲福利一区二区
  • <menu id="esycg"><strong id="esycg"></strong></menu>
  • <input id="esycg"></input>
  • 国产真实乱子伦精品视频| 国产欧美精品一区二区三区四区| 9色porny自拍视频一区二区| 韩国一区二区视频| 国产精品系列在线播放| 亚洲一区免费视频| 国产人成亚洲第一网站在线播放| 国产综合久久久久久鬼色| 奇米四色…亚洲| 成人app软件下载大全免费| 欧美日韩极品在线观看一区| 91精品国产综合久久福利| 欧美视频一区在线| 精品国产欧美一区二区| 一区二区激情小说| 国产一区二区福利| 日韩av电影免费观看高清完整版在线观看| 国产成人精品亚洲777人妖| 久久这里都是精品| 日韩电影在线一区| 国产99久久久国产精品免费看| 99久久久免费精品国产一区二区| 亚洲成人在线观看视频| 成人午夜视频在线观看| 欧美日精品一区视频| 亚洲老司机在线| 69精品人人人人| 欧美日韩免费在线视频| 国产91精品一区二区麻豆亚洲| 日韩高清一级片| 欧美日韩1234| 亚洲精品乱码久久久久久| 色呦呦网站一区| 丁香激情综合国产| 欧美一区中文字幕| 不卡电影免费在线播放一区| 欧美日韩在线三级| 中文字幕在线一区| 26uuu国产在线精品一区二区| 国产精品免费免费| 日日夜夜精品视频天天综合网| 国产毛片精品国产一区二区三区| 欧美精品一区二区在线播放| 欧美三级电影在线看| 国产精品久久影院| 久久国产剧场电影| 精品一区二区三区免费| 久久精品一区二区三区不卡| 国产一区二区三区在线观看免费视频| 亚洲免费观看高清完整| 亚洲免费毛片网站| 欧美国产成人精品| 亚洲精品国产高清久久伦理二区| 欧美肥大bbwbbw高潮| 欧美日韩色综合| 视频一区二区三区入口| 国产盗摄视频一区二区三区| 精品国产一区二区在线观看| 亚洲综合色区另类av| 丝袜美腿成人在线| 色哟哟亚洲精品| 亚洲午夜电影网| 成人av在线一区二区| 精品一二线国产| 亚洲视频免费在线观看| 日韩电影在线免费| 国产精品亚洲一区二区三区在线| 91免费看`日韩一区二区| 日本欧美一区二区在线观看| 欧美理论电影在线| 国产精品久久久久久户外露出| 成人深夜视频在线观看| 日本亚洲视频在线| 亚洲线精品一区二区三区八戒| 美女视频一区在线观看| 久久青草欧美一区二区三区| av在线一区二区| 亚洲精品成人a在线观看| 无码av中文一区二区三区桃花岛| 99精品视频免费在线观看| 日韩高清在线不卡| 有码一区二区三区| 欧美va天堂va视频va在线| 亚洲人成网站色在线观看| 91免费观看视频在线| 欧美成人a∨高清免费观看| 欧美性xxxxxxxx| 成人高清av在线| 国产suv精品一区二区883| 香蕉久久夜色精品国产使用方法| 日韩免费视频线观看| 一本久久综合亚洲鲁鲁五月天| 国产精品国产三级国产专播品爱网| 东方欧美亚洲色图在线| 懂色av中文一区二区三区| 五月激情丁香一区二区三区| 国产一区久久久| 国产婷婷色一区二区三区| jvid福利写真一区二区三区| 91高清在线观看| 91久色porny| 欧美日韩一区二区在线观看| 亚洲福利国产精品| 蜜臀精品久久久久久蜜臀| 国产亚洲欧美一区在线观看| 亚洲国产高清aⅴ视频| 欧美主播一区二区三区美女| 欧美极品另类videosde| 色综合久久久久久久久久久| 亚洲伦理在线精品| 亚洲国产视频一区| 日韩精品中文字幕一区二区三区| 中文字幕不卡在线播放| 成人妖精视频yjsp地址| www.欧美日韩| 3atv一区二区三区| 国产一区二区免费看| 久久97超碰色| 久久精品国产亚洲一区二区三区| 91精品国产高清一区二区三区| 欧美日韩一区三区四区| 亚洲伊人色欲综合网| 蓝色福利精品导航| 六月婷婷色综合| 91麻豆产精品久久久久久| 国产精品天美传媒| 91亚洲永久精品| 亚洲综合色在线| 在线视频一区二区三区| 亚洲精品国产无天堂网2021| 日韩成人精品在线观看| 国产福利精品导航| 在线观看欧美黄色| 欧美亚洲一区二区在线| 91精品国产综合久久小美女| 久久99久久99小草精品免视看| 久久久久国产精品人| 99精品欧美一区| 香蕉成人伊视频在线观看| 国产成人精品aa毛片| 成人中文字幕合集| 日韩一级片在线观看| 久久99精品国产.久久久久| 免费xxxx性欧美18vr| 欧美精品乱码久久久久久按摩| 最近中文字幕一区二区三区| 欧美男女性生活在线直播观看| 国产福利一区二区三区视频在线| 91麻豆文化传媒在线观看| 欧美最猛黑人xxxxx猛交| 91精品国产91热久久久做人人| 欧美日韩视频专区在线播放| 在线播放国产精品二区一二区四区| 亚洲男人的天堂av| 3d成人h动漫网站入口| 国产乱国产乱300精品| 欧美一区二区三区视频免费播放| 99久久伊人网影院| 国产黄色精品网站| 韩国成人在线视频| 91福利在线看| 在线视频国内一区二区| 精品福利一区二区三区| 国产成人亚洲综合a∨猫咪| 免费高清不卡av| 精品一区二区在线免费观看| 国产在线精品免费av| 欧美精品黑人性xxxx| 国产精品人人做人人爽人人添| 亚洲一区av在线| 亚洲一区二区三区四区中文字幕| 另类调教123区| 在线看国产日韩| 精品久久国产字幕高潮| 日韩中文字幕av电影| 国产999精品久久久久久绿帽| 精品美女在线播放| 日韩理论片中文av| 欧美日韩午夜精品| 色妹子一区二区| 国产三级精品在线| 韩国成人福利片在线播放| 99久久久精品| 国产精品夜夜嗨| 精品一区二区三区久久| 久久精品夜色噜噜亚洲aⅴ| 欧美不卡一二三| 日韩毛片一二三区| 99久久国产综合精品女不卡| 日韩福利电影在线观看| 99精品欧美一区| 亚洲三级电影全部在线观看高清| 国产亚洲欧洲一区高清在线观看| 国产欧美中文在线| 久久一留热品黄| 国产亚洲福利社区一区| 成人黄色软件下载| 欧美理论电影在线| 欧美变态tickling挠脚心| 麻豆精品精品国产自在97香蕉|