11 Jun 18 复习, pymsql

12   Jun 18 复习 pymysql,orm

  1. pymysql 的安装

pip3 install pymysql

2.  pymysql的基本语法

mport pymysql

conn = pymysql.connect(

host="127.0.0.1",

port=3306,

user="root",

password="123",

database="day62",

charset="utf8",

autocommit=True,

)

cursor = conn.cursor()

cursor.execute("select * from user;")

ret = cursor.fetchall() # fetchone, fetchmany

# conn.commit()

cursor.close()

conn.close()

3  pymsql:execute()之sql注入

原因: 符号--会注释掉它之后的sql

例如: 在一条sql语句中如果遇到select * from t1 where id > 3 -- and name=‘egon‘;则--之后的条件被注释掉了

#1、sql注入之:用户存在,绕过密码

egon‘ -- 任意字符

#2、sql注入之:用户不存在,绕过用户与密码

xxx‘ or 1=1 -- 任意字符

解决方案:不自行进行sql语句拼接;execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了

sql="select * from userinfo where name=%s and password=%s" #!!!

res=cursor.execute(sql,[user,pwd])

4 单例简版orm(youku版)

Mysql_singleton.py

import pymysql

class Mysql:

__instance=None

def __init__(self):

self.conn=pymysql.connect(

host=‘127.0.0.1‘,

port=3306,

user=‘root‘,

password=‘123‘,

charset=‘utf8‘,

database=‘youku‘,

autocommit=True

)

self.cursor=self.conn.cursor(cursor=pymysql.cursors.DictCursor)

def close_db(self):

self.cursor.close()

self.conn.close()

def select(self, sql, args=None):

self.cursor.execute(sql, args)

return self.cursor.fetchall()

def execute(self, sql, args):

try:

self.cursor.execute(sql, args)

affected = self.cursor.rowcount

except BaseException as e:

print(e)

return affected

@classmethod

def singleton(cls):

if not cls.__instance:

cls.__instense=cls()

return  cls.__instance

fuckorm.py

from orm import Mysql_singleton

class Fileld:

def __init__(self,name,column_type,primary_key,default):

self.name=name

self.column_type=column_type

self.primary_key= primary_key

self.default=default

class StringFileld(Fileld):

def __init__(self,name=None,column_type=‘varchar(200)‘,primary_key=False,default=None):

super().__init__(name,column_type,primary_key,default)

class IntegerFileld(Fileld):

def __init__(self,name=None,column_type=‘int‘,primary_key=False,default=0):

super().__init__(name,column_type,primary_key,default)

class ModlesMetaclass(type):

def __new__(cls, name,bases,attrs):

if name==‘Modles‘:

return type.__new__(cls,name,bases,attrs)

table_name=attrs.get(‘table_name‘,None)

primary_key=None

mappings=dict()

for k,v in attrs.items():

if isinstance(v,Fileld):#v 是不是Field的对象

mappings[k]=v

if v.primary_key:

#找到主键

if primary_key:

raise TypeError(‘主键重复:%s‘%k)

primary_key=k

for k in mappings.keys():

attrs.pop(k)

if not primary_key:

raise TypeError(‘没有主键‘)

attrs[‘table_name‘]=table_name

attrs[‘primary_key‘]=primary_key

attrs[‘mappings‘]=mappings

return type.__new__(cls,name,bases,attrs)

class Modles(dict,metaclass=ModlesMetaclass):

def __init__(self,**kwargs):

super().__init__(**kwargs)

def __setattr__(self, key, value):

self[key]=value

def __getattr__(self, item):

try:

return self[item]

except TypeError:

raise (‘没有该属性‘)

@classmethod

def select_one(cls,**kwargs):

key=list(kwargs.keys())[0]

value=kwargs[key]

sql=‘select * from %s where %s=?‘%(cls.table_name,key)

sql=sql.replace(‘?‘,‘%s‘)

ms=Mysql_singleton.Mysql().singleton()

re=ms.select(sql,value)

if re:

u=cls(**re[0])

return u

else:

return

@classmethod

def select_many(cls,**kwargs):

ms = Mysql_singleton.Mysql().singleton()

if kwargs:

key=list(kwargs.keys())[0]

value=kwargs[key]

sql = ‘select * from %s where %s=?‘ % (cls.table_name, key)

sql = sql.replace(‘?‘, ‘%s‘)

re = ms.select(sql, value)

else:

sql = ‘select * from %s‘%(cls.table_name)

re = ms.select(sql)

if re:

lis_obj=[cls(**r) for r in re]

return lis_obj

else:

return

def update(self):

ms = Mysql_singleton.Mysql().singleton()

filed=[]

pr=None

args=[]

for k,v in self.mappings.items():

if v.primary_key:

pr=getattr(self,v.name,None)

else:

filed.append(v.name + ‘=?‘)

args.append(getattr(self,v.name,v.default))

sql=‘update %s set %s where %s =%s‘%(self.table_name,‘,‘.join(filed),self.primary_key,pr)

sql=sql.replace(‘?‘,‘%s‘)

ms.execute(sql,args)

def save(self):

ms = Mysql_singleton.Mysql().singleton()

filed=[]

values=[]

args=[]

for k,v in self.mappings.items():

if not v.primary_key:

filed.append(v.name)

values.append(‘?‘)

args.append(getattr(self,v.name,v.default))

sql =‘insert into %s (%s) VALUES (%s)‘%(self.table_name,‘,‘.join(filed),‘,‘.join(values))

sql= sql.replace(‘?‘,‘%s‘)

ms.execute(sql,args)

原文地址:https://www.cnblogs.com/zhangyaqian/p/py201806120.html

时间: 2024-10-09 07:26:30

11 Jun 18 复习, pymsql的相关文章

13 Jun 18 复习, Mac中不同版本的python调用

13   Jun 18 复习 mac中python的安装 调python3 :/usr/local/bin/python3 调python2(系统自带): /usr/bin/python 在/etc/paths中设置环境变量路径的搜索优先级 当做如上设定时,先检索/usr/local/bin,后检索/usr/bin,故而在cmd中输入python可直接调出python3 原文地址:https://www.cnblogs.com/zhangyaqian/p/py201806130.html

15 Jun 18 复习, shutil模块

15 Jun 18 复习shutil模块(高级的文件.文件夹.压缩包 处理模块) shutil.copyfileobj(fsrc, fdst[, length])  #将文件内容拷贝到另一个文件中 import shutil shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w')) shutil.copyfile(src, dst)  # 拷贝文件 import shutil shutil.copyfile('f1.log', '

5 Jun 18 复习,模块

5 Jul 17 复习,内置模块与第三方模块 一.time与datetime import time # 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. print(time.time())  # 1528188733.8373 # 格式化的时间字符串(Format String) print(time.strftime("%Y-%m-%d %X"))  # 2018-06-05 16:52:13 # 结构化的时间(st

破解navicat for mysql 11.0.18版本

首先要下载好一个navicat for mysql 11.0.18版本,一定要11.0.18版本,因为其他的版本貌似无法破解,试了几个版本都不行,所以就只能是11.0.18的,附件里就有的下载 然后下载另一个附件zip包,将附件解压成一个文件夹,按照附件里面的说明书进行 重中之重来了:生成的license文件,一定要保存在注册机所在的文件夹里,因为如果你保存在其他地方,是找不到的,起码我好几次都没找到过

中国互联:TOP域名11月18日开售

互联网已经成为全球经济命脉 互联网发展30年中,全球人口数目从1985年的48亿增长至2014年71.3亿.据悉,2025年全球人口将突破80亿大关.人口的急速增长的同时将消费市场带向繁荣.在2014年达沃斯论坛中,中华人民共和国国家互联网信息办公室主任指出:"目前中国互联网网站近400万家.中国互联网经济增长速度有两位数,而且是以30%的速度递增." 域名是互联网的敲门砖 在域名发展的历史时间中,可以简单分成:规则--规则+资源两个时段."资源"之声一直是占据着主

5 Jun 18 jQuery

# 图片太多,详细见link 以及文本 5 Jun 18 一. 今日面试 1. os和sys都是干什么的? os 这个模块提供了一种方便的使用操作系统函数的方法. os: This module provides a portable way of using operating system dependent functionality. sys 这个模块可供访问由解释器使用或维护的变量和与解释器进行交互的函数. sys: This module provides access to som

8 Jun 18 Bootstrap

8 Jun 18 一.今日面试题 设计表结构(外键约束怎么建?) http://www.cnblogs.com/linhaifeng/articles/7238814.html#_label6 二.昨日内容补充:滚动的进度条 三.今日内容 Bootstrap常用组件 导航条不用放在container中:页面其他内容(大部分)需要放在container中 导航条中的悬浮用.navbar_left: 页面其他内容(大部分)的悬浮用pull_left 2. Bootstrap常用插件 1. 模态框 2

2014年11月17~11月18日,杨学明老师《企业IT需求收集和实施》内训在湖南长沙某酒店成功举办!

2014年11月17至18日,受湖南某软件企业的邀请,杨学明老师<企业IT需求收集和实施>内训在某长沙某五星级酒店成功举办!来自全国各地的IT高管和企业负责人参加了此次培训.杨学明老师分别从企业IT规划与选型普遍面临的问题和挑战. IT需求及策略. IT建设原则.IT流程体系. IT组织.IT选型步骤.IT实施步骤.实际选型和案例.选型流程分享等进行了讲解,共60多人参加了此次内训,课后大家一致认为课程含金量高,是国内最好的IT规划类课程.

2017.11月8复习总结

1html(超文本标记语言由浏览器解析'prase') 对于中文网页需要使用 <meta charset="utf-8"> 声明编码,否则会出现乱码.有些浏览器会设置 GBK 为默认编码,则你需要设置为 <meta charset="gbk">. GBK包含全部中文字符:UTF-8则包含全世界所有国家需要用到的字符. GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准)UTF-8编码的文字可以在各国各种支持U