用python执行创建表的sql语句

前言

用的数据库是mysql,第三方库是pymysql

对于数据库语言,创建数据表,用的是,这个语句(还可以自己再加点东西)

"""create table tablename (column_name column_type);"""

用python的第三方库pymysql,如果创建表,写sql语句。。。,如果这样,何必要用python,就先在终端或者某个地方创建表。

但是无论怎么用都是要执行sql语句,这点确实逃不掉。。。

希望

我希望用python创建表的过程是写个表名,再简单的写数据类型,其他我不想写。然后就能创建表了。

困难

1,列数是不确定的。

2,数据的类型是不缺定的。

不知道怎么说了

正文

直接给出代码,看注释

def zidian(count):
# count作为数据类型选择参数
    if count == 1:
        b = {1: 'int not null primary key auto_increment'}
    elif count == 0:
        b = {0: 'int not null'}
    else:
        b = {
            count: f'varchar({count}) not null'
        }
    return b[count]

def create_table(tablename, **kwargs):
#动态参数列表
    a = len(kwargs)
    key = []
#列表,存储列的名字
    values = []
#列表,存储为选择数据类型提供参数
    for i in kwargs.values():
        values.append(i)
    for i in kwargs.keys():
        key.append(i)
#加到列表中
    s = str()
#s是字符串
    for i, t in zip(key, values):
#zip函数,一起遍历
        a = (i, zidain(t))
# a是个元组
        b = ' '.join(a)
#元组变成字符串,用空格隔开
        b += ','
#b 加上逗号
        s += b
#结束循环
    s = s[:-1]
#去掉最后一个逗号
    s = "(" + s + ")"
#加上括号
    a = f"""create table if not exists {tablename}{s}default charset=utf8;"""
# 拼接sql语句
    print(a)
#打印出来

操作

比如来这样一段python代码

create_table('we',id=1,name=10,work=30)
# 结合上面的封装
# 这段代码执行的意思
’we‘ 表名
#  id=1 id 就是列的名字,1 在zidian函数中进行替换1就变成了 int not null primary key auto_increment
#  naeme=10,name就是列名,10进行了替换变成了varchar(10) not null
# work=30,也是一样的,30替换变成了varchar(30) not null

打印出来的sql语句长这样的

create table if not exists we(id int not null primary key auto_increment,name varchar(10) not null,work varchar(30) not null)default charset=utf8;

再写一个

create_table('we',id=1,name=10,work=30,age=0)

打印出来

create table if not exists we(id int not null primary key auto_increment,name varchar(10) not null,work varchar(30) not null,age int not null)default charset=utf8;

动态创建了。

可能看着很长,没有格式化,当然不好看,但是仔细看看,这段sql语句没有问题

可以执行。

结合pymysql,结合面向对象,再次进行封装

代码如下

    def zidain(self,count):
        if count == 1:
            b = {1: 'int not null primary key auto_increment'}
        elif count==0:
            b={0:'int not null'}
        else:
            b = {
               count: f'varchar({count}) not null'
            }
        return b[count]
#sql的数据类型,并没有完全封装,datatime之类的,但是这已经不是个问题了
    def creat_table(self,tablename, **kwargs):
        a = len(kwargs)
        key = []
        values = []
        for i in kwargs.values():
            values.append(i)
        for i in kwargs.keys():
            key.append(i)
        s = str()
        for i, t in zip(key, values):
            a = (i, self.zidain(t))
            b = ' '.join(a)
            b += ','
            s += b
        s = s[:-1]
        s = "(" + s + ")"
        a = f"""create table if not exists {tablename}{s}default charset=utf8;"""
        self.sql(a)
·        #执行sql语句
        return self
#返回对象本身,为了链式调用

运行

from init import my_sql
#导包,my_sql就是封装的类
#封装pymysql的包
# 链式调用
my_sql().use_db('school').creat_table('wang',id=1,name=20,age=0,work=30).close()
这段代码的意思
初始化-使用school这个数据库--创建表--关闭

结果

运行前

用python执行创建表的sql语句_第1张图片

只有一个表

运行代码

用python执行创建表的sql语句_第2张图片

创建成功,哈哈哈哈哈

查看表的结构

from init import my_sql
# def desc_tablename(self,tablename,show=False):
#              ....
#     return c,self
my_sql().use_db('school').desc_tablename('wang',True)[1].close()
# desc_tablename返回值有两个,一个是列表,另一个是self,对象本身
# 其中还封装了prettable,True表示展示,默认不展示False。

如图

用python执行创建表的sql语句_第3张图片

耶✌✌✌✌✌✌✌

你可能感兴趣的:(python,mysql)