import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
#创建连接实例
db = sqlalchemy.create_engine("mysql+pymysql://root:123@localhost/sqlalchemydb")
#"数据库类型+数据库模块://用户名:密码@主机/库名"
#定义表
#定义一个元类的继承类
base = declarative_base(db) #开始定义表
class User(base):
__tablename__ = "user"
id = sqlalchemy.Column(sqlalchemy.Integer,primary_key=True)
name = sqlalchemy.Column(sqlalchemy.String(32)) if __name__ == "__main__":
base.metadata.create_all(db) #进行增删改查
#类似于pymysql 的游标 cursor
from sqlalchemy.orm import sessionmaker #绑定连接
cursor = sessionmaker(bind=db) #得到的时一个类 session = cursor() #实例化 # 增
# user = User(
# id = 1,
# name = "老边"
# )
#
# session.add(user)
# session.commit()
# session.add_all([
# User(id = 2, name = "老赵"),
# User(id = 3, name = "老李")
# ])
# session.commit()
#查
# all_data = session.query(User).all() #查所有
# print(all_data) #得到对象
# for data in all_data:
# print("id:%s__name:%s"%(data.id,data.name)) many_data = session.query(User).filter_by(id = 1) #查多条
data, = many_data
print("id:%s__name:%s" % (data.id, data.name))
# for data in many_data:
# print("id:%s__name:%s"%(data.id,data.name)) #data = session.query(User).get(ident=3) #查一条,只能以主键查
#print("id:%s__name:%s" % (data.id, data.name)) #删除
#先查询一条
# data = session.query(User).get(ident=3)
# #然后删除
# session.delete(data)
# #然后提交操作
# session.commit()
#改
# 先查询一条
# data = session.query(User).get(ident=2)
# #然后删除
# data.name = "老李"
# #然后提交操作
# session.commit()

元类

import pymysql

class Field(object):
def __init__(self,name,column_type):
self.name = name
self.column_type = column_type
def __str__(self):
return "<%s:%s>"%(self.name,self.column_type) class StringField(Field):
def __init__(self,name):
super(StringField,self).__init__(name,"varchar(100)") class IntegerField(Field):
def __init__(self,name):
super(IntegerField,self).__init__(name,"int") class ModelMetaClass(type):
def __new__(cls, name,bases,attrs):
'''
:param name: 类的名称
:param bases: 类的继承
:param attrs: 类的属性
:return:
'''
if name == "Model":
return type.__new__(cls,name,bases,attrs)
mapping = dict() #空字典
for k,v in attrs.items(): #遍历属性
if isinstance(v,Field): #判断属性是否Field的实例
mapping[k] = v #添加到mapping当中
for k in mapping.keys(): #返回所有键
attrs.pop(k) #从属性当中删除
attrs["__mapping__"] = mapping #设定__mapping__属性来保存字段
attrs["__table__"] = name
return type.__new__(cls,name,bases,attrs) class Model(dict,metaclass = ModelMetaClass):
def __init__(self,**kwargs):
self.db = pymysql.connect(
host = "localhost",
user = "root",
password = "",
database = "test"
)
self.cursor = self.db.cursor()
super(Model,self).__init__(**kwargs) def __getattr__(self, key):
return self[key] def __setattr__(self, key, value):
self[key] = value def save(self):
fields = [] #空列表用来存储字段
args = [] #空列表用来存储字段的值
for k,v in self.__mapping__.items():
fields.append(v.name)
args.append(getattr(self,k,None))
sql = "insert into %s(%s) values (%s)"%(
self.__table__,
",".join(fields),
",".join([repr(str(i)) for i in args]
)) #sql拼接
self.cursor.execute(sql)
print(sql)
def __del__(self):
'''
回收内存
'''
self.db.commit()
self.cursor.close()
self.db.close() class Student(Model):
name = StringField("name")
room_id = IntegerField("room_id") u = Student(name = "老边",room_id = 18)
u.save()

元类,sqlalchemy查询的更多相关文章

  1. python中对象、类型和元类之间的关系

    在python中对象.类型和元类构成了一个微妙的世界. 他们有在这个世界里和平共处,相辅相成.它们遵循着几条亘古不变的定律: 1.python中无处不对象 2.所有对象都有三种特性:id.类型.值 3 ...

  2. tornado 07 数据库—ORM—SQLAlchemy—查询

    tornado 07 数据库—ORM—SQLAlchemy—查询 引言 #上节课使用query从数据库查询到了结果,但是query返回的对象是直接可用的吗 #在query.py内输入一下内容 from ...

  3. Python异常处理及元类

    一.异常处理 异常是错误发生的信号,一旦程序出错就会产生一个异常,如果该异常没有被应用程序处理,那么该异常就会跑出来,程序的执行也随之终止,也就是说异常就是一个事件,该事件会在程序执行过程中发生,影响 ...

  4. 元类, pymysql

    元类, pymysql 一.元类 自定义元类 ''' 1.什么是元类? - 类的类就是type,其实type就是元类 2.元类的作用? 3.如何创建元类以及使用? ''' # # 1.一切皆对象 # ...

  5. Python进阶:set和dict/对象引用、可变性和垃圾回收/元类编程/迭代器和生成器

    frozenset:不可变集合,无序,不重复 dict上的特性: 1. dict的key或者set的值 都必须是可以hash的(不可变对象 都是可hash的, str, fronzenset, tup ...

  6. python基础--反射、元类、单例设计模式

    反射:reflect,反射指的是一个对象应该具备可以检测.修改.增加自身属性的能力,反射就是通过字符串操作属性 hasattr(对象,带查询的属性名称) 判断某个对象中是否存在某个属性 getattr ...

  7. SQLAlchemy查询

    SQLAlchemy查询 结果查询: from databases.wechat import User from config import session def search(): result ...

  8. Python抽象类以及元类

    抽象基类: 继承的约束与协议 __doc__ = """ 抽象基类: 继承的约束与协议 # 抽象基类 --- 有点java的味道,也有点golang的味道,继承,协议,接 ...

  9. Hibernate--------八大类HQL查询集合

    Hibernate的   八大类HQL查询集合 Hibernate的八大类HQL查询集合: 一:属性查询(SimplePropertyQuery) 1,单一属性查询 *返回结果集属性列表,元素类型和实 ...

随机推荐

  1. Scrapy框架: 通用爬虫之XMLFeedSpider

    步骤01: 创建项目 scrapy startproject xmlfeedspider 步骤02: 使用XMLFeedSpider模版创建爬虫 scrapy genspider -t xmlfeed ...

  2. mysql 性能调优 参数随写

    set global innodb_buffer_pool_size = 12*1024*1024*1024;set global bulk_insert_buffer_size = 12582912 ...

  3. boby标签中相关标签

    有关字体相关的标签 h1~h6   字体大小 标题使用<h1>至<h6>标签进行定义,<h1>定义最大的标题,<h6>定义最小的标题.具有 align属 ...

  4. go中加号的用法

    // + 的用法 package main import "fmt" func main() { // 加号两端都是数字的话,做加法运算 var i = 1 var j = 1 v ...

  5. css颜色单位

    /* 用颜色的单词表示不同的颜色:red, green, blue等等 */ p { background-color: red; } /* 用rgb三元色表示,rgb => red, gree ...

  6. showmount - 显示关于 NFS 服务器文件系统挂载的信息

    总览 /usr/sbin/showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] ...

  7. IO,文件

    IO 1. 定义 >在内存中存在数据交换的操作认为是IO操作,比如和终端交互 ,和磁盘交互,和网络交互等 2. 程序分类 >* IO密集型程序:在程序执行中有大量IO操作,而cpu运算较少 ...

  8. 图形设计 X11

    显示适配器驱动程序安装范例 AMD驱动加载 Intel驱动加载

  9. 将word文档中的回车符进行删除

  10. c++网络库之 poco

    java 不好吗?java面向对象很好啊. poco 做的像 java 用起来更面向对象,这是优势.开发速度提升很多.boost 那种是给大牛看的.我觉得 poco 用起来方便,不清楚的地方随时看源码 ...