# 創建類的時候要生成建表的語句 如何知道創建一個類了
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