Python中如何为数据库创建新用户并正确赋予权限?

网上找了很多,老是在赋权限的时候报错,不知道为啥,百度了一下,大多说的都是创建表的时候出错,和我问题不符合 grant all privileges on zhangsanDb.* to zhangsan@’%’ identified by ‘zhangsan’;
Python中如何为数据库创建新用户并正确赋予权限?

7 回复

问问题时候描述清楚,报错,报错信息是什么?数据库是什么版本?
先说一种可能性,mysql8 不能用 grant 命令创建用户并授权


在Python里给数据库建新用户和赋权,直接跑SQL语句就行。用mysql-connector-python库连上数据库,拿有足够权限的账号(比如root)执行CREATE USERGRANT命令。

下面是个操作MySQL的完整例子:

import mysql.connector
from mysql.connector import Error

def create_user_and_grant(host, root_user, root_password, new_user, new_password, database):
    """创建新用户并授予指定数据库的所有权限"""
    connection = None
    try:
        # 1. 用root权限连接
        connection = mysql.connector.connect(
            host=host,
            user=root_user,
            password=root_password
        )
        
        if connection.is_connected():
            cursor = connection.cursor()
            
            # 2. 创建新用户
            create_user_sql = f"CREATE USER '{new_user}'@'%' IDENTIFIED BY '{new_password}'"
            cursor.execute(create_user_sql)
            print(f"用户 '{new_user}' 创建成功")
            
            # 3. 授予数据库所有权限
            grant_sql = f"GRANT ALL PRIVILEGES ON {database}.* TO '{new_user}'@'%'"
            cursor.execute(grant_sql)
            
            # 4. 刷新权限使更改生效
            cursor.execute("FLUSH PRIVILEGES")
            print(f"已授予 '{new_user}' 对数据库 '{database}' 的所有权限")
            
    except Error as e:
        print(f"操作失败: {e}")
    finally:
        if connection and connection.is_connected():
            cursor.close()
            connection.close()

# 使用示例
create_user_and_grant(
    host="localhost",
    root_user="root",
    root_password="your_root_password",  # 替换为你的root密码
    new_user="app_user",
    new_password="StrongPass123!",
    database="my_app_db"
)

关键点:

  1. 连接账号要有CREATE USERGRANT OPTION权限
  2. CREATE USER创建用户,IDENTIFIED BY设置密码
  3. GRANT语句赋权,ON database.*指定数据库
  4. FLUSH PRIVILEGES立即生效权限更改
  5. '%'允许从任何主机连接,生产环境建议限制IP

权限控制示例:

# 只授予SELECT, INSERT, UPDATE权限
grant_sql = f"GRANT SELECT, INSERT, UPDATE ON {database}.* TO '{new_user}'@'%'"

# 授予特定表的权限
grant_sql = f"GRANT SELECT ON {database}.users TO '{new_user}'@'%'"

安全提醒:

  • 生产环境避免在代码里硬编码root密码
  • 新用户密码要足够复杂
  • 按最小权限原则赋权

其他数据库(PostgreSQL、SQLite等)语法不同,但思路一样:用管理账号连接,执行对应的用户管理和权限SQL。

简单说就是连上数据库执行创建用户和授权的SQL语句。

所以为什么在 python 节点

以前换 mysql 新版本时,也碰到过这个问题,后来在官方文档上找到新的方法:
grant usage on zhangsanDb.* to zhangsan@’%’ identified by ‘zhangsan’;
https://dev.mysql.com/doc/refman/8.0/en/grant.html

一楼说的对

上次我弄错了,找到以前的为知笔记:
创建用户:create user ‘zhangsan’@’%’ identified by ‘12345678’;
设置数据库权限:GRANT ALL ON . TO ‘zhangsan’@’%’; flush privileges;

已经解决,谢谢大家,是版本的问题,最新版本可能不兼容,我现在换成 5.7 版本可以了

回到顶部