sqlalchemy学习(一)


sqlalchemy

系统的学一下sqlalchemyA,不过没有中文文档,只能用我的渣英文能力慢慢看原文档了

数据库连接

>>> from sqlalchemy import create_engine
>>> engine = create_engine('sqlite:///:memory:', echo=True)

echo为True输出日志

各种数据库连接方式

dialect+driver://username:password@host:port/database
  1. Postgresql

    # default
    engine = create_engine('postgresql://scott:tiger@localhost/mydatabase')
    # psycopg2
    engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/mydatabase')
    # pg8000
    engine = create_engine('postgresql+pg8000://scott:tiger@localhost/mydatabase')
    
  2. MySQL

    # default
    engine = create_engine('mysql://scott:tiger@localhost/foo')
    # mysql-python
    engine = create_engine('mysql+mysqldb://scott:tiger@localhost/foo')
    # MySQL-connector-python
    engine = create_engine('mysql+mysqlconnector://scott:tiger@localhost/foo')
    # OurSQL
    engine = create_engine('mysql+oursql://scott:tiger@localhost/foo')
    
  3. Oracle

    engine = create_engine('oracle://scott:tiger@127.0.0.1:1521/sidname')
    engine = create_engine('oracle+cx_oracle://scott:tiger@tnsname')
    
  4. SQLite

    # sqlite://<nohostname>/<path>
    # where <path> is relative:
    engine = create_engine('sqlite:///foo.db')
    #Unix/Mac - 4 initial slashes in total
    engine = create_engine('sqlite:////absolute/path/to/foo.db')
    #Windows
    engine = create_engine('sqlite:///C:\\path\\to\\foo.db')
    #Windows alternative using raw string
    engine = create_engine(r'sqlite:///C:\path\to\foo.db')
    # To use a SQLite :memory: database, specify an empty URL:
    engine = create_engine('sqlite://')
    

声明样式

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

Base = declarative_base()
class User(Base):
     __tablename__ = 'users'

     id = Column(Integer, primary_key=True)
     name = Column(String)
     fullname = Column(String)
     password = Column(String)

     def __repr__(self):
        return "<User(name='%s', fullname='%s', password='%s')>" % (
                             self.name, self.fullname, self.password)

样式参数说明

  说明
**\_tablename\_\_** 表名

字段类型及说明

字段类型及文档

  1. Generic Types

    字段类型 说明
    BigInteger 大数
    Boolean(createconstraint=True, name=None, _createevents=True) 布尔
    Data  
    DateTime(timezone=False) 时间
    Enum(*enums, **kw) 枚举
    Float(precision=None, asdecimal=False, decimalreturnscale=None, **kwargs) 浮点型
    Integer 整型
    Interval(native=True, secondprecision=None, dayprecision=None) 时间间隔
    LargeBinary(length=None) 二进制大对象
    MatchType(createconstraint=True, name=None, _createevents=True)  
    Numeric(precision=None, scale=None, decimalreturnscale=None, asdecimal=True)  
    PickleType(protocol=2, pickler=None, comparator=None)  
    SchemaType(name=None, schema=None, metadata=None, inheritschema=False, quote=None, _createevents=True)  
    SmallInteger 小整型
    String(length=None, collation=None, convertunicode=False, unicodeerror=None, _warnonbytestring=False) 字符串
    Text(length=None, collation=None, convertunicode=False, unicodeerror=None, _warnonbytestring=False) 文本对象
    Time(timezone=False) 时间
    Unicode(length=None, **kwargs)  
    UnicodeText(length=None, **kwargs)  

  2. SQL Standard Types

    字段类型 说明
    BIGINT  
    BINARY(length=None)  
    BLOB(length=None)  
    BOOLEAN(createconstraint=True, name=None, _createevents=True)  
    CHAR(length=None, collation=None, convertunicode=False, unicodeerror=None, _warnonbytestring=False)  
    CLOB(length=None, collation=None, convertunicode=False, unicodeerror=None, _warnonbytestring=False)  
    DATE  
    DATETIME(timezone=False)  
    DECIMAL(precision=None, scale=None, decimalreturnscale=None, asdecimal=True)  
    FLOAT(precision=None, asdecimal=False, decimalreturnscale=None, **kwargs)  
    INT  
    INTEGER  
    NCHAR(length=None, **kwargs)  
    NVARCHAR(length=None, **kwargs)  
    NUMERIC(precision=None, scale=None, decimalreturnscale=None, asdecimal=True)¶  
    REAL(precision=None, asdecimal=False, decimalreturnscale=None, **kwargs)  
    SMALLINT  
    TEXT(length=None, collation=None, convertunicode=False, unicodeerror=None, _warnonbytestring=False  
    TIME(timezone=False)  
    TIMESTAMP(timezone=False)  
    VARBINARY(length=None)  
    VARCHAR(length=None, collation=None, convertunicode=False, unicodeerror=None, _warnonbytestring=False)  

创建表

Base.metadata.create_all(engine)

为表创建实例

>>> ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
>>> ed_user.name
'ed'
>>> ed_user.password
'edspassword'
>>> str(ed_user.id)
'None'

创建session

>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker(bind=engine)

你也可以先创建Session,在创建应用前

>>> Session = sessionmaker()

当你创建了应用,可以这样配置

>>> Session.configure(bind=engine)  # once engine is available

插入和更新数据

插入

插入一条数据

>>> ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
>>> session.add(ed_user)

插入多条数据

>>> session.add_all([
...     User(name='wendy', fullname='Wendy Williams', password='foobar'),
...     User(name='mary', fullname='Mary Contrary', password='xxg527'),
...     User(name='fred', fullname='Fred Flinstone', password='blah')])

更新

>>> ed_user.password = 'f8s7ccs'

查看

>>> session.dirty
IdentitySet([<User(name='ed', fullname='Ed Jones', password='f8s7ccs')>])
>>> session.new  # doctest: +SKIP
IdentitySet([<User(name='wendy', fullname='Wendy Williams', password='foobar')>,
<User(name='mary', fullname='Mary Contrary', password='xxg527')>,
<User(name='fred', fullname='Fred Flinstone', password='blah')>])

必须提交才能生效

>>> session.commit()

There are comments.

  • 如何备份postgresql数据库


    对于网站来说数据无疑是最重要的,而养成备份数据的习惯更加重要, 忽然想到一句经典台词

    曾经有一份数据摆在我的面前,
    可我没有备份,
    直到数据丢失后才后悔莫及,
    人世间最痛苦的事莫过于此,
    如果上天能给我一次再来一次的机会,
    我会对那份数据说五个字:我要备份你,
    如果非要在这份备份上加一个期限,我希望是每天!

    进入主题,这只是对数据进行简单的备份

    怎么备份数据

    shell脚本

    1
    2
    3
    4
    5
    6
    #!/bin/bash
    
    backup_time=`date +%Y%m%d`
    pg_dump articledb > /home/xxx/backup/article_$backup_time.sql
    # articledb是要备份的数据库名称
    echo "backup finished"
    

    保存为backup_db.sh
    注意
    xxx是数据库用户,并且是super权限
    可以这样

    $ sudo -i …
  • flask学习——数据库操作


    flask 作为后端数据库操作是必要的,现在记录一下一些flask数据库的相关操作, 我将使用三种方法操作数据库
    暂时使用较简单的sqlite作为例子

    相关环境的安装

    建议使用ve虚拟环境

    sudo pacman -S sqlite # archlinux
    sudo pip install virtualenv 
    # 在vertualenv环境下执行
    pip install Flask-SQLAlchemy Jinja2 SQLAlchemy
    

    最好是多看文档

    1.使用sqlite3模块API

    参考资料
    这是最简单的方法,不仅适用于flask,python的其他方面也一样适用,如爬虫之类

    连接数据库

    1
    2
    3
    4
    5
    6
    7
    #!/usr/bin/env python
    # -*- coding=UTF-8 -*-
    import sqlite3
    database = /path/test …
  • postgresql学习1——安装


    最近从sqlite转到postgresql,虽然postgresql比sqlite更加复杂

    archlinux

    参考资料

    $ sudo pacman -S postgresql
    $ sudo mkdir /var/lib/postgres/data #如果已存在则可以不建立
    $ sudo chmod -R postgres:postgres /var/lib/postgres/data
    由于我安装系统时没有生成en_US_UTF-8本地化文件(如果已经生成了的就
    不必再生成)
    $ sudo vim /etc/locale.gen #找到en_US_UTF-8,注释掉
    $ locale-gen
    
    然后运行
    $ sudo -i -u postgres #或者使用root账户su - postgres
    $ initdb --locale en_US.UTF-8 -E UTF8 -D …
  • postgresql学习2——使用


    postgresql的简单使用

    python

    参考资料

    安装psycopg2

    推荐使用venv虚拟环境

    pip install psycopg2
    

    这个API打开一个连接到PostgreSQL数据库。如果成功打开数据库时,它返回一个连接对象

    psycopg2.connect(database="testdb", user="postgres", password="cohondob", host="127.0.0.1", port="5432")
    

    该程序创建一个光标将用于整个数据库使用Python编程。

    connection.cursor()
    

    此例程执行SQL语句。可被参数化的SQL语句(即占位符,而不是SQL文字)。 psycopg2的模块支持占位符用%s标志

    cursor.execute(sql [, optional parameters])
    

    该程序执行SQL命令对所有参数序列或序列中的sql映射

    curosr.executemany(sql, seq_of_parameters)
    

    这个程序执行的存储数据库程序给定的名称。该程序预计为每一个参数,参数的顺序必须包含一个条目。

    curosr …