# 连接数据库

mssql+zxjdbc://user:pass@host:port/dbname[?key=value&key=value...]
mssql+adodbapi://<username>:<password>@<dsnname>

# engine = create_engine('mssql+pymssql://scott:tiger@hostname:port/dbname',**kwargs)
echo=True, # 输出sql语句

 

deprecate_large_types=True 

#当该标志是True,在UnicodeTextTextLargeBinary数据类型,用于渲DD时,将呈现类型NVARCHAR(max)VARCHAR(max)以及VARBINARY(max),分别。这是添加此标志后的新行为。

#当该标志是False,在UnicodeTextTextLargeBinary数据类型,用于渲染DDL时,将呈现类型NTEXTTEXT以及IMAGE,分别。这是这些类型的长期行为。

isolation_level="REPEATABLE READ"
  
  • AUTOCOMMIT - 特定于pyodbc / pymssql
  • READ COMMITTED
  • READ UNCOMMITTED
  • REPEATABLE READ
  • SERIALIZABLE
  • SNAPSHOT - 特定于SQL Server

echo  True  打印日志  默认False  不输出日志

mssql_clustered True  支持聚簇索引(和主键)



MOdel 类

  
from sqlalchemy.dialects.mssql import \
    BIGINT, BINARY, BIT, CHAR, DATE, DATETIME, DATETIME2, \
    DATETIMEOFFSET, DECIMAL, FLOAT, IMAGE, INTEGER, MONEY, \
    NCHAR, NTEXT, NUMERIC, NVARCHAR, REAL, SMALLDATETIME, \
    SMALLINT, SMALLMONEY, SQL_VARIANT, TEXT, TIME, \
    TIMESTAMP, TINYINT, UNIQUEIDENTIFIER, VARBINARY, VARCHAR

BIGINT 长整数 __init__()

CHAR 定长字段 __init__length = Nonecollat​​ion = Noneconvert_unicode = Falseunicode_error = None_warn_on_bytestring = False 
DATETIME2 __init__(precision = None** kw 

   DATETIMEOFFSET  __init__precision = None** kwargs 

 

 IMAGE __init__(length=None

 

   Money  __init__()

   Nchar __init__(length=None,**kwargs)

   ntext  

   nvarchar

  real

 

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
 
engine = create_engine("mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(user,password,host,port,db_name),echo=False)
 
DB_Session = sessionmaker(bind=engine)
 
Base = declarative_base()
 
 
class SeedOrm(Base):
    __tablename__ = 'crawl_seed_url'
    id = Column(Integer, primary_key=True,autoincrement=True)
    keyword= Column(String(32))
    province=Column(String(32))
    url = Column(String(128))

  

Integer int 常规整形,通常为32位
SmallInteger    int 短整形,通常为16位
BigInteger  int或long    精度不受限整形
Float   float   浮点数
Numeric decimal.Decimal 定点数
String  str 可变长度字符串
Text    str 可变长度字符串,适合大量文本
Unicode unicode 可变长度Unicode字符串
Boolean bool    布尔型
Date    datetime.date   日期类型
Time    datetime.time   时间类型
Interval    datetime.timedelta  时间间隔
Enum    str 字符列表
PickleType  任意Python对象  自动Pickle序列化
LargeBinary str 二进制
 
常见的SQLALCHEMY列选项
可选参数    描述
primary_key 如果设置为True,则为该列表的主键
unique  如果设置为True,该列不允许相同值
index   如果设置为True,为该列创建索引,查询效率会更高
nullable    如果设置为True,该列允许为空。如果设置为False,该列不允许空值
default 定义该列的默认值
 
 
## 可以通过遍历对象的  __dict__ 取到对象data
# 简单查询  
session = DB_session()
session.query(User).all()
session.query(User.name, User.fullname).all()
session.query(User, User.name).all() # User对象为行数据
 
# 带条件查询
 
session.query(User).filter_by(name='user1').all()  # select * from User where name = 'user1' 
session.query(User).filter(User).filter(User.name == 'user').all() # 同上
session.query(User).filter(User).filter(User.name.like('user%').all() # select * from User where name like 'user%'
session.query(User).filter(User).filter(User.name.in_(['ed','wendy','jack'])).all() # select * from User where name in ('ed','wendy','jack')
 
 
from sqlalchemy import and_, or_
# 多条件查询
session.query(User).filter(and_(User.name.like('many1'),User.id>=10)).all()
session.query(User).filter(and_(User.name.like('many1'),User.password != None)).all()

 

# sql 过滤

session.query(User).filter(User.id>10).all()

session.query(User).filter("id>:id").params(id=1).all()

 

# 分页 用于query对象限制 副词

session.query(User).limit(1).all()

// 使用偏移时必须使用order_by配合使用  否则报错

session.query(User).order_by(User.id).limit(10).offset(10).all()

# 对查询到的数据排序

from sqlalchemy import desc

session.query(User).filter(User.id>=2).order_by(User.id) # 默认升序

session.query(User).filter(User.id>=2).order_by(desc(User.id) ) # 降序排列

 

# 关联查询

session.query(User, Address).filter(User.id == Address.user_id).all()

session.query(User).join(User.addresses).all()

# 疑问

session.query(User).outerjoin(User.addresses).all()

 

# 聚合查询

session.query(User.id, func.count('*').label('user_count').group_by(User.name).all() # 返回元祖列表

session.query(User.name,func.sum(User.id).label("user_id_sum")).group_by(User.name).all()

 

# 子查询

stmt =session.query(Address.user_id,func.count('*').label('address_count')).group_by(Address.user_id).subquery()

session.query(User, stmt.c.address_count).outerjoin((stmt, User.id==stmt.c.user_id)).order_by(User.id).all()

 

# exists

session.query(User).filter(exists().where(User.id == 2)).first() # 存在  不存在返回None

session.query(User).filter(~exists().where(User.id == 2)).first() # 不存在

 

# 记录总数查询

session.query(func.count(User.id))

session.query(func.count(User.id)).\
        group_by(User.name)