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. javaIO流(五)--对象序列化

    一.序列化概念 几乎只要是我们的java开发,就一定会存在有序列化的概念,而正是有序列化的概念逐步发展,慢慢也有了更多的系列化的标准.--所谓的对象序列化指的是将内存中保存的对象,以二进制数据流的形式 ...

  2. PHPStorm remoteHost链接FTP成功,但不显示文件目录

    ============================================== 勾上前两个选项就可以了

  3. 新手学习 React 迷惑的点

    网上各种言论说 React 上手比 Vue 难,可能难就难不能深刻理解 JSX,或者对 ES6 的一些特性理解得不够深刻,导致觉得有些点难以理解,然后说 React 比较难上手,还反人类啥的,所以我打 ...

  4. 自增主键与UUID的优缺点

    自增主键 自增ID是在设计表时将id字段的值设置为自增的形式,这样当插入一行数据时无需指定id会自动根据前一字段的ID值+1进行填充.在MySQL数据库中,可通过sql语句AUTO_INCREMENT ...

  5. .net core swagger汉化

    基本swagger使用不再详解,具体百度其它帖子 1.将汉化的swagger js文件复制到项目根目录中 js代码如下 'use strict'; /** * Translator for docum ...

  6. 一、spring的基本认识

    Spring的认识 Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用 Spring是于2003 年兴起的一个轻量级的J ...

  7. Mac 安装cnpm

    1.先安装node   node的下载地址:http://nodejs.cn/download/   这个没什么好说的,安装完成后测试一下,在终端输入:node -v   这时候就可以看到安装的nod ...

  8. linux 命令 - ls(列出目录内容)

    ls - 列出目录内容 语法: ls (选项) (参数) 选项: -a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影藏,不会列出): -A:显示除影藏文件“.”和“..”以外的所有文 ...

  9. 爬虫示例--requests-module

    reuqests_test .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { ...

  10. 转:谈谈Linux下动态库查找路径的问题

    http://blog.chinaunix.net/uid-23069658-id-4028681.html 学习到了一个阶段之后,就需要不断的总结.沉淀.清零,然后才能继续“上路”.回想起自己当年刚 ...