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. Java程序员必精通之—synchronized

    更多Java并发文章:https://www.cnblogs.com/hello-shf/category/1619780.html 一.简介 相信每一个java程序员对synchronized都不会 ...

  2. CSS中让背景图片居中且不平铺

    background:url(../images/logo.jpg) no-repeat center ;

  3. Codeforces 1114C(数论)

    题面 传送门 分析 我们先考虑n!在10进制下有多少个0 由于10=2*5, 我们考虑n!的分解式中5的指数,答案显然等于\(\frac{n}{5}+\frac{n}{5^2}+\frac{n}{5^ ...

  4. JS高级程序随笔一

    function Aarguments(x,y){ for(var i=0;i<arguments.length;i++){ alert(arguments[i]); }; }; Aargume ...

  5. Codefores 507B Amr and Pins

    B. Amr and Pins time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  6. elasticsearch 父子关系

    ElasticSearch 中的Parent-Child关系和nested模型是相似的, 两个都可以用于复杂的数据结构中,区别是 nested 类型的文档是把所有的实体聚合到一个文档中而Parent- ...

  7. vue-cli脚手架快速搭建项目

    前言 vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目. 准备工作 在搭建一个vue项目之前,需要先安装好node.js和cnpm. 虽然np ...

  8. Delphi 字符串函数SysUtils单元 AnsiSameStr、AnsiSameText、AnsiCompareStr、AnsiCompareText、AnsiCompareFileName、AnsiUpperCase、AnsiLowerCase、AnsiUpperCaseFileName、AnsiLowerCaseFileName、AnsiPos、AnsiQuotedStr

    USES 单元 SysUtils 非 StrUtils AnsiSameStr.AnsiSameText.AnsiCompareStr.AnsiCompareText.AnsiCompareFileN ...

  9. 在树莓派3B上搭建LAMP

    一.安装apache2 sudo apt-get install apache2 在电脑上输入树莓派的网址会有如下显示 二.安装Mysql sudo apt-get install mysql-ser ...

  10. Springboot与jsp使用404错误

    未加依赖包时出现:Did not find handler method for [/WEB-INF/views/login.jsp] 加入下面依赖包: <dependency> < ...