sqlalchemy如何使用

這篇文章主要介紹了sqlalchemy如何使用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇sqlalchemy如何使用文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

成都創(chuàng)新互聯(lián)公司是由多位在大型網(wǎng)絡(luò)公司、廣告設(shè)計(jì)公司的優(yōu)秀設(shè)計(jì)人員和策劃人員組成的一個(gè)具有豐富經(jīng)驗(yàn)的團(tuán)隊(duì),其中包括網(wǎng)站策劃、網(wǎng)頁(yè)美工、網(wǎng)站程序員、網(wǎng)頁(yè)設(shè)計(jì)師、平面廣告設(shè)計(jì)師、網(wǎng)絡(luò)營(yíng)銷(xiāo)人員及形象策劃。承接:成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站改版、網(wǎng)頁(yè)設(shè)計(jì)制作、網(wǎng)站建設(shè)與維護(hù)、網(wǎng)絡(luò)推廣、數(shù)據(jù)庫(kù)開(kāi)發(fā),以高性?xún)r(jià)比制作企業(yè)網(wǎng)站、行業(yè)門(mén)戶(hù)平臺(tái)等全方位的服務(wù)。

SQLAlchemy:

是一個(gè)ORM框架;

大量使用元編程;

編程時(shí),先對(duì)象&關(guān)系映射,才能操作DB,已成為工業(yè)標(biāo)準(zhǔn);

pip install sqlalchemy pyMySQL

pip show sqlalchemy

sqlalchemy如何使用

> import sqlalchemy

> sqlalchemy.__version__ #version check

sqlalchemy如何使用

開(kāi)發(fā)中,一般都采用ORM框架,這樣就可使用對(duì)象操作表了;

定義表映射的類(lèi),使用Column的描述器定義類(lèi)屬性,使用ForeignKey定義外鍵約束;

如果在一個(gè)對(duì)象中,想查看其它表對(duì)象的內(nèi)容,就要使用relationship來(lái)定義關(guān)系;

是否使用FK?

支持,力挺派,能使數(shù)據(jù)保證完整性、一致性;

不支持,嫌棄派,開(kāi)發(fā)難度增加,大量數(shù)據(jù)時(shí)影響插入、修改、刪除的效率;

通常要在業(yè)務(wù)層保證數(shù)據(jù)一致性(事務(wù));

注:

賬號(hào)密碼授權(quán),若為前端用戶(hù),僅用來(lái)查數(shù)據(jù),用grant select即可,不要grant all;

UML,統(tǒng)一建模語(yǔ)言;

navicat mysql,右鍵庫(kù)或表,轉(zhuǎn)儲(chǔ)SQL文件,結(jié)構(gòu)和數(shù)據(jù);若僅導(dǎo)出結(jié)構(gòu),導(dǎo)出前要?jiǎng)h除相關(guān)表中數(shù)據(jù);

oralce中沒(méi)有自增,用到sequence,from sqlalchemy import Sequence

1、declare a mapping:

創(chuàng)建映射:

創(chuàng)建基類(lèi)Base,便于實(shí)體類(lèi)繼承;

創(chuàng)建實(shí)體類(lèi),Student表;

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base() #基類(lèi),創(chuàng)建基類(lèi),一次性的

from sqlalchemy import Column, Integer, String

class Student(Base): #實(shí)體類(lèi),declare a mapping

__tablename__ = 'student' #指定表名,必須寫(xiě),防止忘記對(duì)應(yīng)的表

id = Column('id', Integer, primary_key=True, autoincrement=True)) #定義屬性對(duì)應(yīng)字段,第1參數(shù)是字段名,如果和屬性名一致可省,如果和屬性名不一致要指定;Column類(lèi)指定對(duì)應(yīng)的字段,必須指定,Column即上例的Field;此處'id'可省,Integer為type不能省

name = Column(String(64), nullable=False)

age = Column(Integer)

def __repr__(self):

return '<{} id:{} name:{} age:{}>'.format(self.__class__.__name__, self.id, self.name, self.age)

__str__ = __repr__

2、connecting:

數(shù)據(jù)庫(kù)連接的事情,交給引擎;

echo=True,引擎是否打印執(zhí)行的語(yǔ)句,調(diào)試時(shí)打開(kāi)很方便;

mysqldb的連接:

mysql+mysqldb://<user>:<password>@<host>[:port]/<dbname>

engine = sqlalchemy.create_engine('mysql+mysqldb://root:rootqazwsx@10.113.129.2:3306/test1')

pymysql的連接:

mysql+pymysql://<username>:<password>@<host>:<port>/<dbname>[?<options>],options為與DB連接相關(guān)的選項(xiàng)

engine = sqlalchemy.create_engine('mysql+pymysql://root:rootqazwsx@10.113.129.2:3306/test1')

engine-configuration:

sqlalchemy如何使用

注:

內(nèi)部使用了連接池;

dialect,方言,sql差異;

from sqlalchemy import create_engine

host = '10.113.129.2'

port = 3306

user = 'root'

password = 'rootqazwsx'

database = 'test1'

conn_str = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(user, password, host, port, database)

# engine = create_engine('mysql+pymysql://root:rootqazwsx@10.113.129.2:3306/test1', echo=True) #

engine = create_engine(conn_str, echo=True) #引擎,管理連接池,connecting;echo=True,執(zhí)行的語(yǔ)句是否打印,可在配置文件中全局設(shè)置,調(diào)試時(shí)打開(kāi)

3、create a schema:

Base.metadata.drop_all(engine) #刪除繼承自Base的所有表

Base.metadata.create_all(engine) #create a schema,創(chuàng)建繼承自Base的所有表;Base.metadata中有一張表記錄著所有用Base創(chuàng)建的實(shí)體類(lèi)(實(shí)體類(lèi)繼承自Base),遍歷所有實(shí)體類(lèi),將查到的定義信息填到創(chuàng)建表的語(yǔ)句中;engine的echo=True,打開(kāi),執(zhí)行后會(huì)有建表語(yǔ)句;創(chuàng)建表,共用的功能,而子類(lèi)上是個(gè)性化的功能

注:

生產(chǎn)很少這樣創(chuàng)建表,都是系統(tǒng)上線時(shí)由腳本生成,如用navicat mysql在測(cè)試?yán)镉益I庫(kù)或表,轉(zhuǎn)儲(chǔ)SQL文件,再導(dǎo)入到生產(chǎn)里;

生產(chǎn)很少刪除表,廢棄都不能刪除;

4、creating a session:

在一個(gè)會(huì)話(huà)中操作數(shù)據(jù)庫(kù),會(huì)話(huà)建立在連接上,連接被引擎管理;

from sqlalchemy.orm import sessionmaker

Session = sessionmaker(bind=engine) #方式一;返回類(lèi);另,autoflush=False,autocommit=False

session = Session()實(shí)例化,session.add(),session.add_all(),session.commit(),session.rollback(),session.query(),session.cursor,session.execute()執(zhí)行原生sql

# Session = sessionmaker() #方式二

# session = Session(bind=engine)

注:

class sessionmaker(_SessionClassMethods):

def __init__(self, bind=None, class_=Session, autoflush=True,

autocommit=False,

expire_on_commit=True,

info=None, **kw):

5、create an instance of the mapped class:

例,增:

try:

stu1 = Student()

stu1.name = 'tom' #屬性賦值

stu1.age = 20

# student.id = 100 #有自增字段和有默認(rèn)值的可不加

# session.add(stu1)狀態(tài)為pending

stu2 = Student(name='jerry', age=18) #構(gòu)造的時(shí)候傳入

session.add_all([stu1, stu2])狀態(tài)為pending

# lst = []

# for i in range(10):

# stu = Student()

# stu.name = 'jessica' + str(i)

# stu.age = 20 + i

# lst.append(stu)

# session.add_all(lst)

session.commit()

except Exception as e:

print(e)

session.rollback()

finally:

pass

輸出:

2018-10-10 17:04:18,319 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'

2018-10-10 17:04:18,320 INFO sqlalchemy.engine.base.Engine {}

2018-10-10 17:04:18,333 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()

2018-10-10 17:04:18,333 INFO sqlalchemy.engine.base.Engine {}

2018-10-10 17:04:18,355 INFO sqlalchemy.engine.base.Engine show collation where `Charset` = 'utf8' and `Collation` = 'utf8_bin'

2018-10-10 17:04:18,355 INFO sqlalchemy.engine.base.Engine {}

2018-10-10 17:04:18,371 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1

2018-10-10 17:04:18,371 INFO sqlalchemy.engine.base.Engine {}

2018-10-10 17:04:18,382 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1

2018-10-10 17:04:18,382 INFO sqlalchemy.engine.base.Engine {}

2018-10-10 17:04:18,393 INFO sqlalchemy.engine.base.Engine SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin AS anon_1

2018-10-10 17:04:18,393 INFO sqlalchemy.engine.base.Engine {}

2018-10-10 17:04:18,414 INFO sqlalchemy.engine.base.Engine DESCRIBE `student`

2018-10-10 17:04:18,414 INFO sqlalchemy.engine.base.Engine {}

2018-10-10 17:04:18,430 INFO sqlalchemy.engine.base.Engine

DROP TABLE student

2018-10-10 17:04:18,430 INFO sqlalchemy.engine.base.Engine {}

2018-10-10 17:04:18,447 INFO sqlalchemy.engine.base.Engine COMMIT

2018-10-10 17:04:18,468 INFO sqlalchemy.engine.base.Engine DESCRIBE `student`

2018-10-10 17:04:18,468 INFO sqlalchemy.engine.base.Engine {}

2018-10-10 17:04:18,482 INFO sqlalchemy.engine.base.Engine ROLLBACK

2018-10-10 17:04:18,494 INFO sqlalchemy.engine.base.Engine

CREATE TABLE student (

id INTEGER NOT NULL AUTO_INCREMENT,

name VARCHAR(64) NOT NULL,

age INTEGER,

PRIMARY KEY (id)

)

2018-10-10 17:04:18,494 INFO sqlalchemy.engine.base.Engine {}

2018-10-10 17:04:18,537 INFO sqlalchemy.engine.base.Engine COMMIT

2018-10-10 17:04:18,562 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)

2018-10-10 17:04:18,563 INFO sqlalchemy.engine.base.Engine INSERT INTO student (name, age) VALUES (%(name)s, %(age)s)

2018-10-10 17:04:18,563 INFO sqlalchemy.engine.base.Engine {'age': 20, 'name': 'tom'}

2018-10-10 17:04:18,574 INFO sqlalchemy.engine.base.Engine INSERT INTO student (name, age) VALUES (%(name)s, %(age)s) #用了參數(shù)化查詢(xún)

2018-10-10 17:04:18,574 INFO sqlalchemy.engine.base.Engine {'age': 18, 'name': 'jerry'}

2018-10-10 17:04:18,586 INFO sqlalchemy.engine.base.Engine COMMIT

6、adding and updating:

CRUD操作;

每一個(gè)實(shí)體都有一個(gè)狀態(tài)屬性_sa_instance_state,其類(lèi)型是sqlalchemy.orm.state.InstanceState,可使用sqlalchemy.inspect(entity)函數(shù)查看狀態(tài);

常見(jiàn)的狀態(tài)有:

transient(短暫的,路過(guò)的),實(shí)體類(lèi)尚未加入到session中,同時(shí)并沒(méi)有保存到數(shù)據(jù)庫(kù)中;

pending(未決定的,行將發(fā)生的),transient的實(shí)體被add()到session中,狀態(tài)切換為pending,但還未flush到DB中;

persistent(持久穩(wěn)固的,堅(jiān)持的,固執(zhí)的),session中的實(shí)體對(duì)象對(duì)應(yīng)著DB中的真實(shí)記錄,pending狀態(tài)在提交成功后變?yōu)閜ersistent狀態(tài),或查詢(xún)成功返回的實(shí)體也是persistent狀態(tài);

deleted(已刪除的),實(shí)體被刪除且已flush但未commit完成,事務(wù)提交成功了,實(shí)體變成detached,事務(wù)失敗返回persistent狀態(tài);

detached(單獨(dú)的,冷漠的,超然而客觀的),刪除成功的實(shí)體進(jìn)入這個(gè)狀態(tài);

新建一個(gè)實(shí)體,狀態(tài)是transient臨時(shí)的;

一旦add()后,由transient-->pending;

成功commit()后,由pending-->persistent;

成功查詢(xún)返回的實(shí)體對(duì)象,也是persistent;

persistent狀態(tài)的實(shí)體,依然是persistent狀態(tài);

persistent狀態(tài)的實(shí)體,刪除后,已flush但沒(méi)commit(),轉(zhuǎn)為deleted,事務(wù)成功提交,轉(zhuǎn)為detached,事務(wù)提交失敗,轉(zhuǎn)為persistent;

只有在persistent狀態(tài)的實(shí)體,才能delete和update,即刪除、修改操作,;

例,commit()后的增:

try:

stu1 = Student()

stu1.name = 'tom'

stu1.age = 20

# student.id = 100

print(stu1.id)

session.add(stu1)

# stu2 = Student(name='jerry', age=18)

# session.add_all([stu1, stu2])

session.commit()

print('~~~~~~~~~~~~~~~~~~~~~~~~~~~')

print('@@@@@@@', stu1.id)

stu1.age = 22 #session.commit()后再改,會(huì)先查詢(xún)

session.add(stu1) #再次session.add()和session.commit(),由于id為PK且自增,無(wú)論有無(wú)stu1.age=22都會(huì)新增一條記錄;若id不是自增,有stu1.age=22則是update一條記錄

session.commit() #始終與狀態(tài)有關(guān),感知到stu1有變化才會(huì)提交,能否提交成功看stu1有無(wú)變化,有變化了才提交(id為autoincrement,此例只要執(zhí)行就會(huì)新增一條記錄);stu1主鍵沒(méi)有值,就是新增,主鍵有值,就是找到對(duì)應(yīng)的記錄修改

except Exception as e:

print(e)

session.rollback()

finally:

pass

輸出:

……

2018-10-10 21:20:13,812 INFO sqlalchemy.engine.base.Engine {}

None

2018-10-10 21:20:13,839 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)

2018-10-10 21:20:13,840 INFO sqlalchemy.engine.base.Engine INSERT INTO student (name, age) VALUES (%(name)s, %(age)s)

2018-10-10 21:20:13,841 INFO sqlalchemy.engine.base.Engine {'age': 20, 'name': 'tom'}

2018-10-10 21:20:13,852 INFO sqlalchemy.engine.base.Engine COMMIT

~~~~~~~~~~~~~~~~~~~~~~~~~~~

2018-10-10 21:20:13,881 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)

2018-10-10 21:20:13,881 INFO sqlalchemy.engine.base.Engine SELECT student.id AS student_id, student.name AS student_name, student.age AS student_age

FROM student

WHERE student.id = %(param_1)s

2018-10-10 21:20:13,881 INFO sqlalchemy.engine.base.Engine {'param_1': 16}

@@@@@@@ 16

2018-10-10 21:20:13,894 INFO sqlalchemy.engine.base.Engine UPDATE student SET age=%(age)s WHERE student.id = %(student_id)s

2018-10-10 21:20:13,894 INFO sqlalchemy.engine.base.Engine {'age': 22, 'student_id': 16}

2018-10-10 21:20:13,909 INFO sqlalchemy.engine.base.Engine COMMIT

例,簡(jiǎn)單查詢(xún):

try:

queryobj = session.query(Student).filter(Student.id==8) #query()方法將實(shí)體類(lèi)傳入,返回類(lèi)對(duì)象(是可迭代對(duì)象,查看源碼有__iter__()),這時(shí)候并不查詢(xún),迭代它就執(zhí)行sql來(lái)查詢(xún)數(shù)據(jù)庫(kù),封裝數(shù)據(jù)到指定類(lèi)的實(shí)例;get()方法使用主鍵查詢(xún),返回一條傳入類(lèi)的一個(gè)實(shí)例

# queryobj = session.query(Student) #無(wú)條件

for i in queryobj:

print('########', i)

except Exception as e:

print(e)

輸出:

……

2018-10-10 22:42:32,931 INFO sqlalchemy.engine.base.Engine SELECT student.id AS student_id, student.name AS student_name, student.age AS student_age

FROM student

WHERE student.id = %(id_1)s

2018-10-10 22:42:32,931 INFO sqlalchemy.engine.base.Engine {'id_1': 8}

######## <Student id:8 name:tom age:26>

例,改,錯(cuò)誤示例:

try:

stu1 = Student()

stu1.id = 2 #這種不是改,而是是一個(gè)全新的stu1,如果該id已有,會(huì)PK沖突;正確改的做法,先查再改,得到PK才能改

stu1.name = 'jerry'

stu1.age = 28

session.add(stu1)

session.commit()

except Exception as e:

print(e)

session.rollback()

finally:

pass

輸出:

2018-10-11 08:07:21,772 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)

2018-10-11 08:07:21,773 INFO sqlalchemy.engine.base.Engine INSERT INTO student (id, name, age) VALUES (%(id)s, %(name)s, %(age)s)

2018-10-11 08:07:21,773 INFO sqlalchemy.engine.base.Engine {'age': 28, 'id': 2, 'name': 'jerry'}

2018-10-11 08:07:21,785 INFO sqlalchemy.engine.base.Engine ROLLBACK

(pymysql.err.IntegrityError) (1062, "Duplicate entry '2' for key 'PRIMARY'") [SQL: 'INSERT INTO student (id, name, age) VALUES (%(id)s, %(name)s, %(age)s)'] [parameters: {'age': 28, 'id': 2, 'name': 'jerry'}]

例,改:

先查回來(lái),修改后,再提交;

改不能改PK字段;

先SELECT再UPDATE;

try:

stu1 = session.query(Student).get(2)

print('$$$$$$$', stu1)

stu1.name = 'jowin'

stu1.age = 28

print('#######', stu1)

session.add(stu1)

session.commit()

except Exception as e:

print(e)

session.rollback()

finally:

pass

輸出:

2018-10-11 08:39:56,595 INFO sqlalchemy.engine.base.Engine SELECT student.id AS student_id, student.name AS student_name, student.age AS student_age

FROM student

WHERE student.id = %(param_1)s

2018-10-11 08:39:56,595 INFO sqlalchemy.engine.base.Engine {'param_1': 2}

$$$$$$$ <Student id:2 name:tom age:24>

####### <Student id:2 name:jowin age:28>

2018-10-11 08:39:56,607 INFO sqlalchemy.engine.base.Engine UPDATE student SET name=%(name)s, age=%(age)s WHERE student.id = %(student_id)s

2018-10-11 08:39:56,608 INFO sqlalchemy.engine.base.Engine {'age': 28, 'student_id': 2, 'name': 'jowin'}

2018-10-11 08:39:56,619 INFO sqlalchemy.engine.base.Engine COMMIT

例,刪,錯(cuò)誤示例:

try:

stu1 = Student(id=2, name='sam', age=26)

session.delete(stu1)

session.commit()

except Exception as e:

print(e)

session.rollback()

finally:

pass

輸出:

Instance '<Student at 0xa59438>' is not persisted #未持久的異常

例,刪:

正確做法,先查再刪;

from sqlalchemy import inspect

try:

stu1 = session.query(Student).get(2)

session.delete(stu1)

print('$$$$$$$$$$$$', inspect(stu1))

session.commit()

print('##########', inspect(stu1))

except Exception as e:

print(e)

session.rollabck()

finally:

pass

輸出:

2018-10-11 08:52:12,317 INFO sqlalchemy.engine.base.Engine SELECT student.id AS student_id, student.name AS student_name, student.age AS student_age

FROM student

WHERE student.id = %(param_1)s

2018-10-11 08:52:12,318 INFO sqlalchemy.engine.base.Engine {'param_1': 2}

$$$$$$$$$$$$ <sqlalchemy.orm.state.InstanceState object at 0x000000000401B400>

2018-10-11 08:52:12,330 INFO sqlalchemy.engine.base.Engine DELETE FROM student WHERE student.id = %(id)s

2018-10-11 08:52:12,330 INFO sqlalchemy.engine.base.Engine {'id': 2}

2018-10-11 08:52:12,342 INFO sqlalchemy.engine.base.Engine COMMIT

########## <sqlalchemy.orm.state.InstanceState object at 0x000000000401B400>

例,刪:

from sqlalchemy import inspect

def show(entity):

ins = inspect(entity)

print('~~~~~~~~~~~~~~~', ins.transient, ins.pending, ins.persistent, ins.detached)

try:

# print('~~~~~~~~~~~~~', Student.__dict__)

stu1 = session.query(Student).get(4)

session.delete(stu1)

# ins = inspect(stu1)

# print('$$$$$$$$$$$$', ins)

show(stu1)

session.commit()

# ins = inspect(stu1)

# print('##########', ins)

show(stu1)

except Exception as e:

print(e)

session.rollabck()

finally:

pass

輸出:

018-10-11 14:40:28,111 INFO sqlalchemy.engine.base.Engine SELECT student.id AS student_id, student.name AS student_name, student.age AS student_age

FROM student

WHERE student.id = %(param_1)s

2018-10-11 14:40:28,111 INFO sqlalchemy.engine.base.Engine {'param_1': 4}

~~~~~~~~~~~~~~~ False False True False

2018-10-11 14:40:28,126 INFO sqlalchemy.engine.base.Engine DELETE FROM student WHERE student.id = %(id)s

2018-10-11 14:40:28,126 INFO sqlalchemy.engine.base.Engine {'id': 4}

2018-10-11 14:40:28,152 INFO sqlalchemy.engine.base.Engine COMMIT

~~~~~~~~~~~~~~~ False False False True

總結(jié):

config.py

USERNAME = 'blog'

PASSWD = 'blog'

IP = '10.10.103.8'

PORT = '3306'

DBNAME = 'blog'

PARAMS = 'charset=utf8mb4'

URL = 'mysql+pymysql://{}:{}@{}:{}/{}?{}'.format(USERNAME, PASSWD, IP, PORT, DBNAME, PARAMS)

DB_DEBUG = True

models.py

from . import config

from sqlalchemy import create_engine

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy import Column, Integer, String, BigInteger, DateTime

from sqlalchemy import ForeignKey, UniqueConstraint, PrimaryKeyConstraint

from sqlalchemy.orm import relationship, sessionmaker

from sqlalchemy.dialects.mysql import LONGTEXT, TINYINT

Base = declarative_base()

class User(Base):創(chuàng)建表

__tablename__ = 'user'

id = Column(Integer, primary_key=True, autoincrement=True)

name = Column(String(48), nullable=False)

password = Column(String(128), nullable=False)

email = Column(String(64), nullable=False, unique=True)

def __repr__(self):

return '<User (id={}, name={}, email={})>'.format(self.id, self.name, self.email)

engine = create_engine(config.URL, echo=config.DB_DEBUG)

def create_all():

Base.metadata.create_all(engine)一旦使用該方法將模型映射到數(shù)據(jù)庫(kù)后,即使改變了模型的字段,也不會(huì)重新映射了

def drop_all():

Base.metadata.drop_all(engine)

Session = sessionmaker(bind=engine)

session = Session()使用orm對(duì)DB操作必須通過(guò)session對(duì)象實(shí)現(xiàn)

注:

conn = engine.connect() #調(diào)用引擎的connect()得到一個(gè)對(duì)象

result = conn.execute('select version()') #通過(guò)conn對(duì)象就可對(duì)DB進(jìn)行操作

print(result.fetchone())

Column常用屬性:

default: 默認(rèn)值

nullable: 是否可空

primary_key: 是否為主鍵

unique: 是否唯一

autoincrement: 是否自增長(zhǎng)

name: 該屬性再數(shù)據(jù)庫(kù)中的字段映射

onupdate: 當(dāng)數(shù)據(jù)更新時(shí)會(huì)自動(dòng)使用這個(gè)屬性,比如update_time = Colum(DateTime, notallow=datetime.now, default=datetime.now)

常用數(shù)據(jù)類(lèi)型:

Integer: 整型

Float: 浮點(diǎn)型,后面只會(huì)保留4位小數(shù),會(huì)有精度丟失問(wèn)題,占據(jù)32位

Double: 雙精度浮點(diǎn)類(lèi)型,占據(jù)64位,也會(huì)存在精度丟失問(wèn)題

DECIMAL: 定點(diǎn)類(lèi)型,解決浮點(diǎn)類(lèi)型精度丟失問(wèn)題;如果精度要求高,比如金錢(qián),則適合用此類(lèi)型

Boolean: 傳遞True/False進(jìn)行

enum: 枚舉類(lèi)型

Date: 傳遞datetime.date()進(jìn)去

Datetime: 傳遞datetime.datetme()進(jìn)去

Time: 傳遞datetime.time()進(jìn)去

String: 字符類(lèi)型,使用時(shí)需要指定長(zhǎng)度,區(qū)別于Text類(lèi)型

Text: 文本類(lèi)型,一般可以存儲(chǔ)6w多個(gè)字符

LONGTEXT: 長(zhǎng)文本類(lèi)型

from sqlalchemy.dialects.mysql import LONGTEXT

因?yàn)長(zhǎng)ONGTEXT只在MySQL數(shù)據(jù)庫(kù)中存在

關(guān)于“sqlalchemy如何使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“sqlalchemy如何使用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁(yè)名稱(chēng):sqlalchemy如何使用
分享鏈接:http://muchs.cn/article38/jpegsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站企業(yè)網(wǎng)站制作、做網(wǎng)站、App開(kāi)發(fā)、軟件開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司