# 创建类的时候要生成建表的语句 如何知道创建一个类了
class Mymetaclass(type):
# 创建类时自动调用
def __init__(self,class_name,class_bases,class_dic):
# print(self)
# print(class_name)
# print(class_bases)
table_name = class_name
print(class_dic)
# 拼接一下
columns = []
# create table 库名.表名(
# 字段名1 字段的数据类型[(宽度) 约束条件]
# sql = 'create table 表名(字段名 字段的类型[(宽度) 约束条件])'
# 不能写死,就将类名当做表名
# table_name = class_name
# 需要分析类来确定表有哪些字段
# 应该在创建类时,就要明确有哪些字段
# 表名能确定了,里面的name 字段的类型[(宽度) 约束条件]这些还不确定
# 用循环取出来,拼接成建表语句
for k,field in class_dic.items(): #items是把字典里面的k,v转成一个元组的形式,元组第一个是k,第二个是v,然后通过解压赋值赋值给他们两个
if isinstance(field,Field):
fs = '%s %s'%(field.name,field.column_type)
# print(fs)
if field.primary_key:
fs+=' primary key'
if field.increment:
fs+=' auto_increment'
columns.append(fs)
# print(columns)
columns = ','.join(columns)
# print(columns)
# 生成最终的sql语句,分号不用加
# sql = 'create table 表名(id int primary key auto_increment,name varchar(20))'
sql = 'create table %s(%s)'%(table_name,columns)
print(sql)
# sql = 'create table class_name(name 字段的类型[(宽度) 约束条件])'
# sql = 'create table class_name(id int primary key auto_increment ,
# name varchar(20)
# )'
# 一个字段包含了多个信息,打包成对象
# 不光要明确字段名称还需要知道类型,长度,约束(是否主键,是否增长,是否默认值)
class Field:
def __init__(self,name,column_type,primary_key = False,increment = False,default = None):
self.name = name
self.column_type = column_type
self.primary_key = primary_key
self.increment = increment
self.default = default
class User(metaclass=Mymetaclass):
# 应该在创建类时,就要明确有哪些字段
# 不光要明确字段名称还需要知道类型,长度,约束(是否主键,是否增长,是否默认值)
# 可以把字段封装成一个对象
id = Field('id','int',primary_key=True,increment=True)
name = Field('name','varchar(20)')
password = Field('password','varchar(20)')
vip = Field('vip','tinyint',default=0)
locked = Field('locked','tinyint',default=0)
def __init__(self,name,password,vip,locked):
self.name = name
self.password = password
self.vip = vip
self.locked = locked