اس کیو ال db/sql
خواندن، بررسی و گونهیابی SQL بدون پایگاه داده: تجزیهگر آگاه از گویش، فهرست جدولها و جانگهدارهای گونهدار.
واردسازی دیتابیس.اس کیو ال
پرسمان یک رشته است، پس غلط املایی داخل آن را پایگاه داده پیدا میکند، آن هم هنگام اجرا و روی همان مسیری که کسی آزمایش نکرده بود. این بسته خود رشته را میخواند: SQL را برای یکی از چهار گویش واکافت و تجزیه میکند، و وقتی طرح جدولها را هم به آن بدهید هر جدول و ستون را پیدا میکند، آنهایی که وجود ندارند را نام میبرد و گونهی هر جانگهدار و هر ستون بازگشتی را میگوید. هیچچیز اینجا به پایگاه داده وصل نمیشود؛ همهاش ایستا است، پس جایش در آزمون یا در گام ساخت برنامه است.
همان ایدهی sqlc در زبان Go است، با این تفاوت که طرح از همان SQL که مینویسید میآید: دستورهای CREATE TABLE در مهاجرتهای شما همان فهرست هستند، پس پروندهی دومی نیست که باید همگام نگه داشته شود.
چیزهایی که مردم را غافلگیر میکند:
- گویش توصیه نیست.
?در SQLite و MySQL جانگهدار است و در PostgreSQL عملگر ساده، چون پستگرس جانگهدارهایش را با$1شماره میزند؛"name"همهجا نام نقلقولشده است جز در MySQL که رشته است؛AUTOINCREMENTوAUTO_INCREMENTوGENERATED ... AS IDENTITYهر کدام به یک موتور تعلق دارند. همان گویشی را بدهید که واقعا روی آن اجرا میکنید. بررسینامها را تنها وقتی پیدا میکند که دستور تجزیه شده باشد. گزارشی که خطای نگارشی دارد چیزی دربارهی ستونها نمیگوید، پس نخست نگارش را درست کنید و دوباره اجرا کنید.- جدولی که ستونهایش معلوم نیست، از
CREATE TABLE ... AS SELECTیا نمایی که بسته نتوانسته بخواند، باز میماند: ستونهای آن هرگز گمشده گزارش نمیشوند. بیخبری همیشه خوشخبری نیست. اعمالدستورها را به ترتیب میخواند، پس نما باید پس از جدولهایی بیاید که از آنها گزینش میکند، درست همانطور که در پایگاه داده هست.- متن عیبها در هر دو حالت زبانی انگلیسی است؛ کدها یکی هستند، پس برنامهی فارسی میتواند روی
codeتطبیق بدهد. جانگهدارهایکوکتور<رشته>به شما میدهد که مالکش هستید: وکتور و رشتههای داخلش را در پایان آزاد کنید.- سلام اجازه میدهد نام فاصله داشته باشد، SQL نه.
SELECT نام خانوادگی FROM tیک ستون و یک نام جایگزین است، نه یک نام، و بیهیچ اعتراضی پذیرفته میشود - و چون نامهای فارسی بیشتر دو واژهاند، دانستنش مهم است. در گیومه بگذاریدشان:SELECT "نام خانوادگی" FROM t.
از همین جا: یک قدمبهقدم از طرح تا پرسمان بررسیشده
شش بخش پس از این، بسته را تکهتکه باز میکنند. این یکی آن را کنار هم میگذارد، به همان ترتیبی که در پروژهای واقعی با آن روبهرو میشوید: پروژهای که از پیش پایگاه داده دارد و انبوهی رشتهی پرسمان. برنامهی زیر تمام مسیر است و همانطور که هست اجرا میشود - بدون سرور، بدون اتصال، بدون هیچ آمادهسازی.
واردسازی رشته
واردسازی دیتابیس.اس کیو ال
ناپایا طرح کلی := اس کیو ال.فهرست جداول {}
تابع عدد(ن: صحیح): رشته:
برگشت رشته.از عدد(ن برگردان صحیح۶۴)
پایان
تابع گام(ش: صحیح، عنوان: رشته):
سرچاپ ""
سرچاپ "گام " + عدد(ش) + ": " + عنوان
پایان
تابع بیازما(پ: رشته):
ناپایا ن := اس کیو ال.بررسی(پ، طرح کلی)
اگر ن.ok و ن.warnings == ۰:
سرچاپ " درست " + پ
وگرنه:
سرچاپ " نادرست " + پ
ناپایا ای := ۰
تا ای < ن.items.طول():
ع := ن.items.بگیر(ای)
سرچاپ " " + ع.code + " " + ع.message
اگر وارونه رشته.خالی است(ع.help):
سرچاپ " " + ع.help
پایان
ای = ای + ۱
پایان
پایان
اس کیو ال.آزادسازی گزارش(ن)
پایان
تابع ریشه:
گام(۱، "طرحی که از پیش دارید")
طرح کلی = اس کیو ال.فهرست تازه(اس کیو ال.گویش شماره(اس کیو ال.اس کیو لایت))
دیرکن اس کیو ال.آزادسازی فهرست(طرح کلی)
ناپایا ساخته := اس کیو ال.اعمال(طرح کلی، """
CREATE TABLE نویسندگان (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
country TEXT
);
CREATE TABLE کتابها (
id INTEGER PRIMARY KEY AUTOINCREMENT,
author_id INTEGER NOT NULL,
title TEXT NOT NULL,
year INTEGER,
price REAL
);
""")
شمارش := " " + عدد(اس کیو ال.شمار جدول(طرح کلی)) + " جدول خوانده شد، "
سرچاپ شمارش + عدد(اس کیو ال.شمار ستون(طرح کلی، "کتابها")) + " ستون روی کتابها"
اگر وارونه ساخته.ok:
سرچاپ اس کیو ال.متن گزارش(ساخته)
پایان
اس کیو ال.آزادسازی گزارش(ساخته)
گام(۲، "پرسمان هایی که از پیش دارید")
بیازما("SELECT id, titles FROM کتابها WHERE author_id = ?")
بیازما("SELECT ک.title, ن.nationality FROM کتابها ک JOIN نویسندگان ن ON ن.id = ک.author_id")
بیازما("INSERT INTO کتابها (title) VALUES (?)")
بیازما("SELECT id FROM کتابها WHERE year = 'recent'")
بیازما("DELETE FROM کتابها")
گام(۳، "همان پنج تا، درست شده")
بیازما("SELECT id, title FROM کتابها WHERE author_id = ?")
بیازما("SELECT ک.title, ن.country FROM کتابها ک JOIN نویسندگان ن ON ن.id = ک.author_id")
بیازما("INSERT INTO کتابها (author_id, title) VALUES (?, ?)")
بیازما("SELECT id FROM کتابها WHERE year = 2024")
بیازما("DELETE FROM کتابها WHERE id = ?")
گام(۴، "یک پرسمان چه می گیرد و چه می دهد")
ناپایا ت := اس کیو ال.تحلیل کن("SELECT title, price FROM کتابها WHERE year > ?"، طرح کلی)
سرچاپ " یک " + اس کیو ال.نام دستور(ت.kind) + " روی " + ت.table
پ := ت.params.بگیر(۰)
سرچاپ " می گیرد " + پ.column + " از گونه " + اس کیو ال.گونه سلام(پ.kind، پ.not_null)
ناپایا ای := ۰
تا ای < ت.results.طول():
س := ت.results.بگیر(ای)
سرچاپ " می دهد " + س.name + " از گونه " + اس کیو ال.گونه سلام(س.kind، وارونه س.nullable)
ای = ای + ۱
پایان
اس کیو ال.آزادسازی تحلیل(ت)
گام(۵، "مقدارها با امنیت سر جایشان می نشینند")
ناپایا مقدارها := اس کیو ال.مقدارهای تازه()
اس کیو ال.افزودن متن(مقدارها، "O'Brien")
اس کیو ال.افزودن عدد(مقدارها، ۱۳۶۷ برگردان صحیح۶۴)
ناپایا خطا := اس کیو ال.گزارش {}
پرشده := اس کیو ال.پرکردن("INSERT INTO کتابها (title, year) VALUES (?, ?)"، مقدارها، اس کیو ال.گویش شماره(اس کیو ال.اس کیو لایت)، خطا)
سرچاپ " " + پرشده
اس کیو ال.آزادسازی گزارش(خطا)
اس کیو ال.آزادسازی مقدارها(مقدارها)
گام(۶، "یا بگذارید خودش کد را بنویسد")
ناپایا ن۲ := اس کیو ال.گزارش {}
ناپایا پرسمان ها := اس کیو ال.خواندن پرسمان ها("""
-- name: BooksByAuthor :many
SELECT id, title, year FROM "کتابها" WHERE author_id = ?;
"""، ن۲)
کد := اس کیو ال.تولید کد("store"، پرسمان ها، طرح کلی، ن۲)
سرچاپ کد
اس کیو ال.آزادسازی پرسمان ها(پرسمان ها)
اس کیو ال.آزادسازی گزارش(ن۲)
برگشت ۰
پایانگام ۱ تنها آمادهسازی موجود است. برای این بسته توصیف طرح نمینویسید؛ همان دستورهای CREATE TABLE که دارید را به آن میدهید. اعمال را به ترتیب روی پروندههای مهاجرتتان بگذارید و فهرست همان طرحی میشود که برنامه واقعا روی آن اجرا میشود.
گام ۲ همان چیزی است که برایش آمدهاید. پنج پرسمان از آنهایی که در هر کدی پیدا میشوند، و پنج شکل متفاوت از غلط بودن: ستونی که به اشتباه جمع نوشته شده، ستونی که به جدول دیگرِ پیوند تعلق دارد، INSERTای که ستون NOT NULL بیپیشفرض را جا انداخته، عددی که با واژهای در گیومه مقایسه شده، و DELETEای بدون WHERE. هر پنج تا بدون پایگاه داده پیدا میشوند و هر کدام میگویند چه باید کرد. آخری هشدار است نه خطا، چون گاهی پاک کردن کل جدول همان قصد است - نکته این است که شما در بازبینی تصمیم بگیرید، نه ساعت دو بامداد.
گام ۳ همان پنج تا است، درست شده، و میارزد پیش از خواندن بقیه، یک بار پرسمانهای خودتان را از این دو گام بگذرانید. سریعترین راه همان دستور است: salam sql check src --schema=db هم پروندههای .sql را میخواند و هم SQL داخل پروندههای .salam را.
گام ۴ جایی است که دیگر یک بازبین ساده نیست. وقتی نامها پیدا شدند، گونهها هم میآیند: جانگهدار option.Option<i64> است چون year میتواند خالی باشد، و title یک str ساده است چون ستونش NOT NULL است. این همان امضایی است که کدتان باید داشته باشد، برگرفته از طرح نه از حافظه.
گام ۵ جلوی قدیمیترین اشکال دنیا را میگیرد. پرکردن مقدارها را با نقلقولی که موتور میخواهد داخل پرسمان مینویسد - ببینید با آپاستروف در O'Brien چه میکند - و چون پرسمان نخست واکافت شده، ?ای که داخل یک رشته نشسته دستنخورده میماند.
گام ۶ بخشی است که میتوانید دیگر با دست ننویسید. یک پرسمان را با نام و گونه حاشیهنویسی کنید و تابع تولیدشده همان پارامترها و همان ساختار ردیفی را دارد که گام ۴ در آورده بود. با salam sql generate queries --schema=db --output=gen/store.salam اجرایش کنید.
دو چیز را با خودتان ببرید. طرح همان دستورهای ساختاری است که از پیش دارید، پس هیچچیز نمیتواند از آن جا بماند. و همهی این بررسیها پیش از اجرای برنامه رخ میدهند، که تنها زمانی است که اشتباه در یک پرسمان ارزان است.
خواندن یک پرسمان بدون پایگاه داده
بازبینی یک دستور، یا یک متن کامل از دستورهای جدا شده با ;، را تجزیه میکند و یک گزارش برمیگرداند. ن.ok به محض اینکه خطایی باشد نادرست است؛ متن گزارش همهی فهرست را همانطور که یک کامپایلر مینویسد نشان میدهد، با خط و ستون و پیام و یک خط راهنما. بیشتر قاعدههای گویش همینجا هستند: یک رشته برای SQLite درست است و برای PostgreSQL غلط، و گزارش میگوید کدام بخشش را عوض کنید.
واردسازی دیتابیس.اس کیو ال
تابع گزارش(عنوان: رشته، پرسمان: رشته، گ: اس کیو ال.گویش):
ناپایا ن := اس کیو ال.بازبینی(پرسمان، گ)
اگر ن.ok:
سرچاپ عنوان، "درست"
وگرنه:
سرچاپ عنوان، اس کیو ال.متن گزارش(ن)
پایان
اس کیو ال.آزادسازی گزارش(ن)
پایان
تابع ریشه:
لایت := اس کیو ال.گویش شماره(اس کیو ال.اس کیو لایت)
مای := اس کیو ال.گویش شماره(اس کیو ال.مای اس کیو ال)
پست := اس کیو ال.گویش شماره(اس کیو ال.پستگرس)
گزارش("پرسمان ساده: "، "SELECT id, name FROM users WHERE id = ?"، لایت)
گزارش("نیمه کاره: "، "SELECT id FROM users WHERE"، لایت)
گزارش("نشانگر غلط: "، "SELECT id FROM users WHERE id = ?"، پست)
گزارش("ویژه پستگرس:"، "SELECT id FROM users WHERE name ILIKE 'a%'"، مای)
گزارش("ویژه مای: "، "CREATE TABLE t (id INT AUTO_INCREMENT)"، لایت)
گزارش("ویرگول فارسی:"، "SELECT id، name FROM users"، لایت)
سرچاپ "شمار جانگهدار:"، اس کیو ال.شمار پارامتر("UPDATE users SET name = ?, age = ? WHERE id = ?"، لایت)
برگشت ۰
پایانکامپایلر همین بررسیها را به شکل یک دستور هم دارد، پس میتوان یک پروژهی کامل را
بدون نوشتن برنامهای برایش بررسی کرد: salam sql check src --schema=db پروندههای
.sql زیر src را میخواند، و رشتههای SQL داخل پروندههای .salam
آن را، و هر کدام را با جایگاهشان در منبع سلام گزارش میکند. بدون --dialect هر
پروندهی سلام با همان موتوری خوانده میشود که واردسازی کرده، پس درختی که
db/sqlite و db/mysql را با هم دارد بدون هیچ گزینهای درست بررسی میشود. پرسمانی که تکهتکه ساخته شده - با + یا
.concat چسبانده شده، یا هر رشتهای که تنها ایرادش این است که در میانه تمام میشود -
تکه است نه دستور، پس شمرده و رد میشود و خطای نگارشی گزارش نمیشود. شمارش در خط پایانی میآید،
پس هیچچیز بیصدا بررسینشده نمیماند؛ تکه بودن خودش دلیل دیگری است برای بستن مقدارها به شکل
جانگهدار به جای چسباندنشان به متن.
هر عیب یک کد دارد. SQL0xx واکافتی است، SQL1xx نگارشی، SQL2xx قاعدهی گویش و SQL3xx نام یا شماری که با طرح نمیخواند. وقتی میخواهید یک چیز خاص را بپذیرید روی کد تطبیق بدهید؛ هرگز روی پیام تطبیق ندهید.
مهاجرتهای شما همان طرح هستند
اعمال دستورهای ساختار را روی یک فهرست جداول اجرا میکند: CREATE TABLE جدولی را با ستونها و گونههایشان و NOT NULL و PRIMARY KEY آنها میافزاید، ALTER TABLE میافزاید و حذف و تغییر نام میکند، DROP برمیدارد و CREATE VIEW ستونهای نما را ثبت میکند. همان رشتههایی را که به دیتابیس.افزودن مهاجرت میدهید به آن بدهید و فهرست همان طرحی میشود که برنامه واقعا دارد.
واردسازی دیتابیس.اس کیو ال
ناپایا طرح جدول ها := اس کیو ال.فهرست جداول {}
تابع بررسی(پرسمان: رشته):
ناپایا ن := اس کیو ال.بررسی(پرسمان، طرح جدول ها)
اگر ن.ok و ن.warnings == ۰:
سرچاپ "درست "، پرسمان
وگرنه:
سرچاپ "نادرست"، پرسمان
سرچاپ اس کیو ال.متن گزارش(ن)
پایان
اس کیو ال.آزادسازی گزارش(ن)
پایان
تابع ریشه:
طرح جدول ها = اس کیو ال.فهرست تازه(اس کیو ال.گویش شماره(اس کیو ال.اس کیو لایت))
دیرکن اس کیو ال.آزادسازی فهرست(طرح جدول ها)
ناپایا ساخته := اس کیو ال.اعمال(طرح جدول ها، """
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
email TEXT NOT NULL,
name TEXT
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL,
total REAL NOT NULL
);
""")
سرچاپ "طرح خوانده شد:"، ساخته.ok، " جدول ها:"، اس کیو ال.شمار جدول(طرح جدول ها)
اس کیو ال.آزادسازی گزارش(ساخته)
بررسی("SELECT u.email, o.total FROM users u JOIN orders o ON o.user_id = u.id WHERE u.id = ?")
بررسی("SELECT id, mail FROM users")
بررسی("SELECT id FROM user")
بررسی("INSERT INTO users (name) VALUES (?)")
بررسی("DELETE FROM orders")
برگشت ۰
پایانبا یک فهرست، بررسی نامها را پیدا میکند: ستون یا جدول ناشناخته خطا است و نزدیکترین نام واقعی پیشنهاد میشود، ستونی که دو جدول پیوندخورده هر دو دارند تا وقتی مشخصش نکنید خطا است، INSERT برابر فهرست ستونها و برابر ستونهایی که NOT NULL بدون مقدار پیشفرض هستند بررسی میشود، و UPDATE یا DELETE بدون WHERE هشدار است، چون تقریبا هرگز منظور همین نبوده.
گونههایی هم که در دست دارد میخواند: مقایسهی ستون عددی با مقداری در گیومه که عدد نیست روی SQLite و MySQL هشدار است، چون آنجا بیصدا هیچوقت برابر نمیشود یا بیصدا صفر میشود، و روی PostgreSQL خطا است چون نمیپذیردش؛ ستونی در فهرست نتیجهی پرسمان GROUP BY که نه گروه شده و نه تجمیع، روی PostgreSQL خطا و جای دیگر هشدار است، با همان استثنایی که خود آن موتورها میگذارند: گروه کردن روی تمام کلید اصلی یک جدول بقیهی ستونهای همان جدول را تعیین میکند، پس آنها بیاشکال هستند؛ و USING (col) در هر دو سمت پیوند بررسی میشود. زیرپرسمانی که برای مقایسهای
که در آن نشسته شمار ستون نادرستی برمیگرداند، ORDER BY 3 وقتی دستور دو ستون
برمیگرداند، LIMIT که عدد نیست، تجمیع در WHERE به جای
HAVING، ستونی که در یک SET دو بار مقدار میگیرد، و دو ستون نتیجه
با یک نام جایگزین هم گزارش میشوند.
گذاشتن مقدارها، با امنیت
هر سه راهانداز SQL دستور آماده ندارند - تنها db/sqlite است که Prepare و Bind* دارد - پس کدی که باید روی MySQL یا PostgreSQL اجرا شود دست آخر مقدارها را با دست به SQL میچسباند، و همینجاست که اشتباه در نقلقول تبدیل به تزریق میشود. پرکردن همین یک کار را درست انجام میدهد: پرسمان را واکافت میکند، پس میداند کدام ? جانگهدار است و کدام نویسهای داخل یک رشته، میسنجد که شمار مقدارها بخواند، و هر مقدار را همانطور که گویش میخواهد مینویسد.
واردسازی دیتابیس.اس کیو ال
تابع نمایش(پرسمان: رشته، م: اس کیو ال.مقدارها، گ: اس کیو ال.گویش):
ناپایا ن := اس کیو ال.گزارش {}
خروجی := اس کیو ال.پرکردن(پرسمان، م، گ، ن)
اگر ن.ok:
سرچاپ خروجی
وگرنه:
سرچاپ اس کیو ال.متن گزارش(ن)
پایان
اس کیو ال.آزادسازی گزارش(ن)
پایان
تابع ریشه:
لایت := اس کیو ال.گویش شماره(اس کیو ال.اس کیو لایت)
پست := اس کیو ال.گویش شماره(اس کیو ال.پستگرس)
ناپایا ردیف := اس کیو ال.مقدارهای تازه()
اس کیو ال.افزودن متن(ردیف، "O'Brien")
اس کیو ال.افزودن عدد(ردیف، ۴۱ برگردان صحیح۶۴)
اس کیو ال.افزودن منطقی(ردیف، درست)
اس کیو ال.افزودن خالی(ردیف)
نمایش("INSERT INTO users (name, age, paid, note) VALUES (?, ?, ?, ?)"، ردیف، لایت)
نمایش("INSERT INTO users (name, age, paid, note) VALUES ($1, $2, $3, $4)"، ردیف، پست)
اس کیو ال.آزادسازی مقدارها(ردیف)
ناپایا حمله := اس کیو ال.مقدارهای تازه()
اس کیو ال.افزودن متن(حمله، "x' OR '1'='1")
نمایش("SELECT id FROM users WHERE name = ?"، حمله، لایت)
اس کیو ال.آزادسازی مقدارها(حمله)
ناپایا یکی := اس کیو ال.مقدارهای تازه()
اس کیو ال.افزودن عدد(یکی، ۷ برگردان صحیح۶۴)
نمایش("SELECT id FROM notes WHERE body = '?' AND id = ?"، یکی، لایت)
نمایش("SELECT id FROM users WHERE id = ? AND org = ?"، یکی، لایت)
اس کیو ال.آزادسازی مقدارها(یکی)
برگشت ۰
پایانمقدار متنی در گیومهی تک پیچیده میشود و هر گیومهی داخلش دو برابر، و روی MySQL ممیز وارون هم دو برابر میشود، چون MySQL ممیز وارون را گریز میخواند و آن دو تای دیگر نه. مقدار منطقی روی SQLite و MySQL 1 یا 0 است و روی PostgreSQL TRUE یا FALSE؛ خالی NULL میشود؛ عددها ساده نوشته میشوند. '?' در پرسمان چهارم همانطور که بود میماند، چیزی که جستوجو و جایگزینی ساده روی رشته اشتباه میگرفت.
این جایگزینی است، نه دستور آماده: پایگاه داده هنوز یک دستور کامل را تجزیه میکند و بازاستفادهی نقشهی اجرا نیست. جایی که راهانداز میتواند آماده و بسته کند، مانند sqlite، همان ابزار بهتری است. جایی که نمیتواند، این راه امن گذاشتن مقدارها است، و یک تابع بازبینیشده است به جای قاعدهی نقلقولی که در هر فراخوانی تکرار شود.
گونهی هر جانگهدار
تحلیل کن هر کاری که بررسی میکند انجام میدهد و علاوه بر آن میگوید پرسمان چه میگیرد و چه برمیگرداند. هر پارامتر میگوید با کدام ستون، در کدام جدول، مقایسه شده و آن ستون چه گونهای دارد؛ هر ستون نتیجه میگوید ستون با چه نامی برمیگردد، گونهاش چیست و میتواند خالی باشد یا نه. گونه سلام آن را به گونهی سلام تبدیل میکند که مقدار را در آن میخوانید، پس LEFT JOIN به شما option.Option<i64> میدهد آنجا که پیوند درونی i64 میدهد.
واردسازی دیتابیس.اس کیو ال
تابع شرح(پرسمان: رشته، طرح: اس کیو ال.فهرست جداول):
ناپایا ت := اس کیو ال.تحلیل کن(پرسمان، طرح)
سرچاپ پرسمان
سرچاپ " دستور:"، اس کیو ال.نام دستور(ت.kind)، "روی"، ت.table
ناپایا ای := ۰
تا ای < ت.params.طول():
پ := ت.params.بگیر(ای)
سرچاپ " جانگهدار"، پ.ordinal، "ستون"، پ.column، "از گونه"، اس کیو ال.گونه سلام(پ.kind، پ.not_null)
ای = ای + ۱
پایان
ناپایا جی := ۰
تا جی < ت.results.طول():
س := ت.results.بگیر(جی)
سرچاپ " ستون"، س.name، "برمی گردد با گونه"، اس کیو ال.گونه سلام(س.kind، وارونه س.nullable)
جی = جی + ۱
پایان
اس کیو ال.آزادسازی تحلیل(ت)
پایان
تابع ریشه:
ناپایا طرح := اس کیو ال.فهرست تازه(اس کیو ال.گویش شماره(اس کیو ال.اس کیو لایت))
دیرکن اس کیو ال.آزادسازی فهرست(طرح)
ناپایا ساخته := اس کیو ال.اعمال(طرح، """
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
email TEXT NOT NULL,
name TEXT,
age INTEGER
);
""")
اس کیو ال.آزادسازی گزارش(ساخته)
شرح("SELECT id, name FROM users WHERE email = ? AND age > ?"، طرح)
شرح("INSERT INTO users (email, name) VALUES (?, ?) RETURNING id"، طرح)
برگشت ۰
پایانهمین اندازه بس است تا کد اتصال یک پرسمان را بسازید، یا در یک آزمون مطمئن شوید پرسمان هنوز همان چیزی را میگیرد و برمیگرداند که کد دور و برش باور دارد. جانگهدارها به ترتیب ظاهر شدن شماره میخورند، همان ترتیبی که راهانداز آنها را میبندد؛ برای PostgreSQL شماره همان عددی است که در $n نوشته شده و جا افتادن یکی از آن شمارهها خودش خطا است.
| کار | ابزار |
|---|---|
| این SQL برای موتور من درست نوشته شده؟ | بازبینی |
| چند مقدار میبندد؟ | شمار پارامتر، جانگهدارها |
| خواندن طرح | فهرست تازه، اعمال |
| جدولها و ستونها وجود دارند؟ | بررسی |
| چه میگیرد و چه برمیگرداند؟ | تحلیل کن |
| کدام گونهی سلام یک ستون را میخواند؟ | گونه سلام |
| گذاشتن مقدارها در SQL با امنیت | مقدارهای تازه، افزودن ...، پرکردن |
| گشتن در طرح | شمار جدول، نام جدول، شمار ستون، ستون شماره، جدول دارد، ستون دارد |
تولید توابع پرسمان
وقتی طرح و تحلیل در دست است، گام آخر مکانیکی میشود، پس بسته خودش انجامش میدهد: یک پروندهی .sql را همانطور که sqlc میخواهد حاشیهنویسی کنید و تولید کد کد سلام آن را مینویسد - یک ساختار ردیف برای هر پرسمان، یک تابع گونهدار برای هر پرسمان، و هر کدام هنگام تولید برابر طرح بررسی میشود.
واردسازی دیتابیس.اس کیو ال
تابع ریشه:
ناپایا طرح := اس کیو ال.فهرست تازه(اس کیو ال.گویش شماره(اس کیو ال.اس کیو لایت))
دیرکن اس کیو ال.آزادسازی فهرست(طرح)
ناپایا ساخته := اس کیو ال.اعمال(طرح، """
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
email TEXT NOT NULL,
name TEXT
);
""")
اس کیو ال.آزادسازی گزارش(ساخته)
پرسمان ها := """
-- name: GetUser :one
SELECT id, email, name FROM users WHERE email = ?;
-- name: CreateUser :exec
INSERT INTO users (email, name) VALUES (?, ?);
"""
ناپایا ن := اس کیو ال.گزارش {}
ناپایا خوانده := اس کیو ال.خواندن پرسمان ها(پرسمان ها، ن)
سرچاپ "پرسمان ها:"، خوانده.طول()
کد := اس کیو ال.تولید کد("store"، خوانده، طرح، ن)
اگر ن.ok:
سرچاپ کد
وگرنه:
سرچاپ اس کیو ال.متن گزارش(ن)
پایان
اس کیو ال.آزادسازی پرسمان ها(خوانده)
اس کیو ال.آزادسازی گزارش(ن)
برگشت ۰
پایانگونهها اینها هستند: :one (نخستین ردیف، با پارامتر خروجی ok &: bool)، :many (یک وکتور از ردیفها)، :exec (یک منطقی) و :execrows (شمار ردیفهای تغییریافته). نام پارامترها از ستونی میآید که هر جانگهدار با آن مقایسه شده و گونهشان هم از همان؛ ستونی که میتواند خالی باشد به شکل option.Option<T> برمیگردد و با IsNull خوانده میشود. پرسمانی که با طرح نخواند تولید را متوقف میکند و نام پرسمان در پیام میآید، پس غلط املایی هرگز به پروندهی تولیدشده نمیرسد.
دستورش این است: salam sql generate queries --schema=db --output=gen/store.salam --package=store. پروندهی تولیدشده یک dyn db.Connection میگیرد، پس یک مجموعه تابع به SQLite و MySQL و PostgreSQL خدمت میکند و نقلقول هر گویش را هنگام اجرا از c.Kind() برمیدارد.
گونهها
پارامتر Param
ساختار پارامتر| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| marker | marker | رشته = "" | جانگهدار همانطور که نوشته شده: ? یا $2 یا :name. |
| ordinal | ordinal | صحیح = 0 | جایش، از ۱؛ برای $n همان عدد است. |
| table | table | رشته = "" | جدول ستونی که با آن مقایسه شده، وقتی چنین ستونی بوده. |
| column | column | رشته = "" | ستونی که با آن مقایسه شده، وقتی چنین ستونی بوده. |
| kind | kind | صحیح = 7 | گونهی TYPE_* آن ستون، یا نوع ناشناخته. |
| not_null | not_null | منطقی = نادرست | درست وقتی آن ستون نمیتواند خالی باشد. |
واردسازی دیتابیس.اس کیو ال
تابع ریشه:
لایت := اس کیو ال.گویش شماره(اس کیو ال.اس کیو لایت)
سرچاپ لایت.name، اس کیو ال.گویش نام("postgresql").name، اس کیو ال.گویش شماره(اس کیو ال.ماریادی بی).name
ناپایا بد := اس کیو ال.بازبینی("SELECT id FROM t WHERE"، لایت)
سرچاپ بد.ok، بد.errors، بد.warnings، بد.statements
سرچاپ اس کیو ال.متن عیب(بد.items.بگیر(۰))
اس کیو ال.آزادسازی گزارش(بد)
سرچاپ اس کیو ال.شمار پارامتر("SELECT a FROM t WHERE b = ? AND c = ?"، لایت)
ناپایا نشانه ها := اس کیو ال.جانگهدارها("SELECT a FROM t WHERE b = ? AND c = ?"، لایت)
سرچاپ نشانه ها.طول()، نشانه ها.بگیر(۰)
نشانه ها.آزادکن()
ناپایا فهرست := اس کیو ال.فهرست تازه(لایت)
ناپایا طرح := اس کیو ال.اعمال(فهرست، """
CREATE TABLE users (id INTEGER PRIMARY KEY, email TEXT NOT NULL, age INTEGER);
""")
سرچاپ "طرح:"، طرح.ok، اس کیو ال.شمار جدول(فهرست)، اس کیو ال.نام جدول(فهرست، ۰)
اس کیو ال.آزادسازی گزارش(طرح)
سرچاپ اس کیو ال.جدول دارد(فهرست، "users")، اس کیو ال.ستون دارد(فهرست، "users"، "email")
ستون یک := اس کیو ال.ستون شماره(فهرست، "users"، ۱)
سرچاپ ستون یک.name، اس کیو ال.نام نوع(ستون یک.kind)، ستون یک.not_null
ناپایا گم := اس کیو ال.بررسی("SELECT nope FROM users"، فهرست)
سرچاپ اس کیو ال.متن گزارش(گم)
اس کیو ال.آزادسازی گزارش(گم)
ناپایا ت := اس کیو ال.تحلیل کن("SELECT id, age FROM users WHERE email = ?"، فهرست)
سرچاپ اس کیو ال.نام دستور(ت.kind)، ت.table، ت.params.طول()، ت.results.طول()
پ := ت.params.بگیر(۰)
سرچاپ پ.marker، پ.ordinal، پ.table + "." + پ.column، اس کیو ال.گونه سلام(پ.kind، پ.not_null)
س := ت.results.بگیر(۱)
سرچاپ س.name، اس کیو ال.نام نوع(س.kind)، س.nullable
اس کیو ال.آزادسازی تحلیل(ت)
ناپایا مقدارها := اس کیو ال.مقدارهای تازه()
اس کیو ال.افزودن عدد(مقدارها، ۳ برگردان صحیح۶۴)
اس کیو ال.افزودن متن(مقدارها، "a'b")
اس کیو ال.افزودن منطقی(مقدارها، نادرست)
اس کیو ال.افزودن اعشار(مقدارها، ۲.۵)
اس کیو ال.افزودن خالی(مقدارها)
سرچاپ اس کیو ال.شمار مقدار(مقدارها)
ناپایا خطا := اس کیو ال.گزارش {}
پرشده := اس کیو ال.پرکردن("INSERT INTO t (a, b, c, d, e) VALUES (?, ?, ?, ?, ?)"، مقدارها، لایت، خطا)
سرچاپ پرشده
اس کیو ال.آزادسازی گزارش(خطا)
اس کیو ال.آزادسازی مقدارها(مقدارها)
اس کیو ال.آزادسازی فهرست(فهرست)
برگشت ۰
پایانستون نتیجه ResultCol
ساختار ستون نتیجه| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| name | name | رشته = "" | نامی که با آن برمیگردد: نام جایگزین، یا نام خود ستون. |
| table | table | رشته = "" | جدولی که از آن آمده، وقتی ستون ساده است. |
| kind | kind | صحیح = 7 | گونهی TYPE_* آن. |
| nullable | nullable | منطقی = درست | درست وقتی میتواند خالی برگردد، که پیوند بیرونی آن را برای تمام یک سمتش درست میکند. |
نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
تحلیل Analysis
ساختار تحلیلتحلیل کن دربارهی یک دستور در میآورد.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| ok | ok | منطقی = درست | درست وقتی هیچچیز خطا نیست. |
| kind | kind | صحیح = 0 | کدام دستور STMT_* است. |
| table | table | رشته = "" | جدولی که از آن میخواند یا در آن مینویسد. |
| params | params | وکتور<پارامتر> | جانگهدارهایش، به ترتیب بستن. |
| results | results | وکتور<ستون نتیجه> | ستونهایی که برمیگرداند. |
| report | report | گزارش | عیبها، همانطور که بررسی میداد. |
| owned | owned | وکتور<رشته> | رشتههایی که تحلیل مالکشان است. آزادسازی تحلیل آزادشان میکند؛ جای دیگری نباید خوانده شود. |
نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
مقدارها Args
ساختار مقدارهامقدارهای تازه و توابع افزودن ... بسازیدش و با آزادسازی مقدارها آزادش کنید.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| kinds | kinds | وکتور<صحیح> | هر مقدار از چه گونهای است؛ یک درایه برای هر مقدار. |
| ints | ints | وکتور<صحیح۶۴> | مقدارهای صحیح، با همان شماره. |
| floats | floats | وکتور<اعشار۶۴> | مقدارهای اعشاری، با همان شماره. |
| texts | texts | وکتور<رشته> | مقدارهای متنی، با همان شماره. افزودن متن رشته را رونوشت میکند، پس فراخواننده مال خودش را نگه میدارد. |
| bools | bools | وکتور<منطقی> | مقدارهای منطقی، با همان شماره. |
نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
گویش Dialect
ساختار گویشگویش شماره یا گویش نام یکی بسازید.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| id | id | صحیح = 0 | کدام موتور: اس کیو لایت، مای اس کیو ال، ماریادی بی یا پستگرس. |
| name | name | رشته = "sqlite" | نام موتور، همانطور که در عیبها میآید. |
| double_quoted_string | double_quoted_string | منطقی = نادرست | درست وقتی "x" رشته است نه نام (MySQL). |
| backtick_ident | backtick_ident | منطقی = نادرست | درست وقتی `x` نام است (MySQL و SQLite). |
| bracket_ident | bracket_ident | منطقی = نادرست | درست وقتی [x] نام است (SQLite). |
| hash_comment | hash_comment | منطقی = نادرست | درست وقتی # توضیح را آغاز میکند (MySQL). |
| dollar_string | dollar_string | منطقی = نادرست | درست وقتی $tag$ ... $tag$ رشته است (PostgreSQL). |
| backslash_escape | backslash_escape | منطقی = نادرست | درست وقتی ممیز وارون داخل رشته میگریزاند (MySQL). |
| qmark_param | qmark_param | منطقی = نادرست | درست وقتی ? جانگهدار است. |
| numbered_param | numbered_param | منطقی = نادرست | درست وقتی $1 جانگهدار است. |
| named_param | named_param | منطقی = نادرست | درست وقتی :name و @name جانگهدار هستند. |
| returning | returning | منطقی = نادرست | درست وقتی RETURNING پشتیبانی میشود. |
| on_conflict | on_conflict | منطقی = نادرست | درست وقتی ON CONFLICT پشتیبانی میشود. |
| on_duplicate | on_duplicate | منطقی = نادرست | درست وقتی ON DUPLICATE KEY UPDATE پشتیبانی میشود. |
| limit_comma | limit_comma | منطقی = نادرست | درست وقتی LIMIT start, count پشتیبانی میشود. |
| ilike | ilike | منطقی = نادرست | درست وقتی ILIKE پشتیبانی میشود. |
| colon_cast | colon_cast | منطقی = نادرست | درست وقتی x::type تبدیل گونه است. |
| autoincrement_word | autoincrement_word | رشته = "" | واژهی خود موتور برای کلید خودافزا. |
نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
عیب Diag
ساختار عیب| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| severity | severity | صحیح = 0 | خطا، هشدار یا یادداشت. |
| code | code | رشته = "" | کد، برای نمونه SQL311. روی همین تطبیق بدهید، نه روی پیام. |
| message | message | رشته = "" | چه چیزی غلط است، در یک خط. |
| help | help | رشته = "" | به جایش چه بنویسید؛ وقتی پیشنهادی نیست خالی است. |
| line | line | صحیح = 1 | خطی که از آن شروع میشود، از ۱. |
| col | col | صحیح = 1 | ستونی که از آن شروع میشود، از ۱. |
| offset | offset | صحیح = 0 | جابجایی بایتی در SQL که از آن شروع میشود. |
| length | length | صحیح = 0 | چند بایت را میپوشاند. |
نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
گزارش Report
ساختار گزارش| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| ok | ok | منطقی = درست | درست وقتی هیچچیز خطا نیست. هشدارها آن را نادرست نمیکنند. |
| errors | errors | صحیح = 0 | چند خطا هست. |
| warnings | warnings | صحیح = 0 | چند هشدار هست. |
| statements | statements | صحیح = 0 | چند دستور تجزیه شد، که راه شمردن آنچه بررسی شده است. |
| items | items | وکتور<عیب> | خود عیبها. |
نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
ستون Column
ساختار ستون| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| name | name | رشته = "" | نامش، همانطور که طرح نوشته. |
| type_name | type_name | رشته = "" | گونهاش، همانطور که طرح نوشته. |
| kind | kind | صحیح = 7 | آن گونه کدامیک از گونههای TYPE_* است. |
| not_null | not_null | منطقی = نادرست | درست وقتی نمیتواند خالی باشد. |
| has_default | has_default | منطقی = نادرست | درست وقتی مقدار پیشفرض دارد، که همان چیزی است که به INSERT اجازه میدهد آن را نیاورد. |
| primary | primary | منطقی = نادرست | درست وقتی بخشی از کلید اصلی است. |
| auto | auto | منطقی = نادرست | درست وقتی موتور خودش پرش میکند. |
| generated | generated | منطقی = نادرست | درست وقتی محاسبه میشود و نمیتوان در آن نوشت. |
نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
جدول Table
ساختار جدول| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| name | name | رشته = "" | نامش. |
| is_view | is_view | منطقی = نادرست | درست وقتی نما است. |
| open | open | منطقی = نادرست | درست وقتی ستونهایش معلوم نیست، که بررسی ستون را برایش خاموش میکند. |
| columns | columns | وکتور<ستون> | ستونهایش، به ترتیب اعلان. |
نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
فهرست جداول Catalog
ساختار فهرست جداولفهرست تازه یکی بسازید و با اعمال پرش کنید.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| d | d | گویش | گویشی که دستورهای ساختار و پرسمانها با آن خوانده میشوند. |
| tables | tables | وکتور<جدول> | جدولها و نماهایی که دارد. |
نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
پرسمان Query
ساختار پرسمان.sql خوانده شده.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| name | name | رشته = "" | نامی که در سرآیند -- name: آمده و برای تابع تولیدشده و ساختار ردیفش به کار میرود. |
| kind | kind | صحیح = 0 | یکی از گونههای Q_*. |
| text | text | رشته = "" | خود SQL، بدون ; پایانی. |
| line | line | صحیح = 1 | خطی که سرآیندش در آن است، تا عیب بتواند به پرونده اشاره کند. |
نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
پایاها و متغیرها
دستور ناشناخته STMT_UNKNOWN
پایا دستور ناشناخته: صحیح۳۲ = 0نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
دستور گزینش STMT_SELECT
پایا دستور گزینش: صحیح۳۲ = 1نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
دستور درج STMT_INSERT
پایا دستور درج: صحیح۳۲ = 2نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
دستور بروزرسانی STMT_UPDATE
پایا دستور بروزرسانی: صحیح۳۲ = 3نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
دستور حذف STMT_DELETE
پایا دستور حذف: صحیح۳۲ = 4نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
دستور طرح STMT_DDL
پایا دستور طرح: صحیح۳۲ = 5نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
اس کیو لایت SQLITE
پایا اس کیو لایت: صحیح۳۲ = 0نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
مای اس کیو ال MYSQL
پایا مای اس کیو ال: صحیح۳۲ = 1نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
ماریادی بی MARIADB
پایا ماریادی بی: صحیح۳۲ = 2نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
پستگرس POSTGRES
پایا پستگرس: صحیح۳۲ = 3نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
خطا ERROR
پایا خطا: صحیح۳۲ = 0نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
هشدار WARNING
پایا هشدار: صحیح۳۲ = 1نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
یادداشت NOTE
پایا یادداشت: صحیح۳۲ = 2نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
نوع خالی TYPE_NULL
پایا نوع خالی: صحیح۳۲ = 0دیتابیس است.نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
نوع صحیح TYPE_INT
پایا نوع صحیح: صحیح۳۲ = 1نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
نوع اعشاری TYPE_FLOAT
پایا نوع اعشاری: صحیح۳۲ = 2نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
نوع متن TYPE_TEXT
پایا نوع متن: صحیح۳۲ = 3نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
نوع دودویی TYPE_BLOB
پایا نوع دودویی: صحیح۳۲ = 4نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
نوع منطقی TYPE_BOOL
پایا نوع منطقی: صحیح۳۲ = 5نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
نوع زمان TYPE_TIME
پایا نوع زمان: صحیح۳۲ = 6نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
نوع ناشناخته TYPE_UNKNOWN
پایا نوع ناشناخته: صحیح۳۲ = 7نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
پرسمان یکی Q_ONE
پایا پرسمان یکی: صحیح۳۲ = 0ok &: bool میگیرد و ساختار ردیف را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
پرسمان چندی Q_MANY
پایا پرسمان چندی: صحیح۳۲ = 1وکتور از آنها برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
پرسمان اجرا Q_EXEC
پایا پرسمان اجرا: صحیح۳۲ = 2نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
پرسمان شمار Q_EXECROWS
پایا پرسمان شمار: صحیح۳۲ = 3Q_EXEC، با این تفاوت که تابع تولیدشده شمار ردیفهای تغییریافته را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
تابعها
بررسی Check
تابع بررسی(sql: رشته، c: فهرست جداول): گزارشنمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
تحلیل کن Analyze
تابع تحلیل کن(sql: رشته، c: فهرست جداول): تحلیلبررسی میکند، بهاضافهی گونهی هر جانگهدار و هر ستون بازگشتی. با آزادسازی تحلیل آزادش کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
آزادسازی تحلیل FreeAnalysis
تابع آزادسازی تحلیل(a &: تحلیل)نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
نام دستور StmtKindName
تابع نام دستور(k: صحیح): رشتهSTMT_*: "select" و "insert" و مانند آن.نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
مقدارهای تازه NewArgs
تابع مقدارهای تازه(): مقدارهانمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
افزودن عدد AddInt
تابع افزودن عدد(a &: مقدارها، v: صحیح۶۴)نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
افزودن اعشار AddFloat
تابع افزودن اعشار(a &: مقدارها، v: اعشار۶۴)نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
افزودن متن AddText
تابع افزودن متن(a &: مقدارها، v: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
افزودن منطقی AddBool
تابع افزودن منطقی(a &: مقدارها، v: منطقی)نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
افزودن خالی AddNull
تابع افزودن خالی(a &: مقدارها)نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
شمار مقدار ArgCount
تابع شمار مقدار(a: مقدارها): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
آزادسازی مقدارها FreeArgs
تابع آزادسازی مقدارها(a &: مقدارها)نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
پرکردن Fill
تابع پرکردن(query: رشته، a: مقدارها، d: گویش، err &: گزارش): رشته? داخل یک رشته دست نخورده میماند، شمار باید بخواند، و هر مقدار همانطور که گویش میخواهد نوشته میشود: گیومهها دو برابر، ممیز وارون روی MySQL دو برابر، TRUE و FALSE روی PostgreSQL. این جایگزینی است نه دستور آماده، و نتیجه مال شماست که آزادش کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
گویش شماره DialectOf
تابع گویش شماره(id: صحیح): گویشاس کیو لایت، مای اس کیو ال، ماریادی بی یا پستگرس.نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
گویش نام DialectNamed
تابع گویش نام(name: رشته): گویش"sqlite" یا "mysql" یا "mariadb" یا "postgres"، که همان چیزی است که دیتابیس.اس کیو لایت و ا.نوع() میدهند. نام ناشناخته SQLite میدهد.نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
آزادسازی گزارش FreeReport
تابع آزادسازی گزارش(r &: گزارش)نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
متن عیب DiagText
تابع متن عیب(d: عیب): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
متن گزارش ReportText
تابع متن گزارش(r: گزارش): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
بازبینی Lint
تابع بازبینی(sql: رشته، d: گویش): گزارشنمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
شمار پارامتر ParamCount
تابع شمار پارامتر(sql: رشته، d: گویش): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
جانگهدارها Placeholders
تابع جانگهدارها(sql: رشته، d: گویش): وکتور<رشته>نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
فهرست تازه NewCatalog
تابع فهرست تازه(d: گویش): فهرست جداولنمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
اعمال Apply
تابع اعمال(c &: فهرست جداول، ddl: رشته): گزارشنمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
آزادسازی فهرست FreeCatalog
تابع آزادسازی فهرست(c &: فهرست جداول)نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
شمار جدول TableCount
تابع شمار جدول(c: فهرست جداول): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
نام جدول TableName
تابع نام جدول(c: فهرست جداول، i: صحیح): رشته"".نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
جدول دارد HasTable
تابع جدول دارد(c: فهرست جداول، name: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
شمار ستون ColumnCount
تابع شمار ستون(c: فهرست جداول، table: رشته): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
ستون شماره ColumnAt
تابع ستون شماره(c: فهرست جداول، table: رشته، i: صحیح): ستونستون خالی.نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
ستون دارد HasColumn
تابع ستون دارد(c: فهرست جداول، table: رشته، column: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
نام نوع KindName
تابع نام نوع(k: صحیح): رشتهTYPE_*: "int" و "text" و مانند آن.نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
گونه سلام SalamType
تابع گونه سلام(k: صحیح، not_null: منطقی): رشتهi64 یا f64 یا bool یا str، پیچیده در option.Option وقتی مقدار میتواند خالی باشد.نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
خواندن پرسمان ها ParseQueries
تابع خواندن پرسمان ها(src: رشته، err &: گزارش): وکتور<پرسمان>-- name: Thing :one و SQL آنها از یک پروندهی پرسمان. نام بد یا گونهی ناشناخته گزارش میشود نه حدس زده.نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
آزادسازی پرسمان ها FreeQueries
تابع آزادسازی پرسمان ها(v &: وکتور<پرسمان>)نمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam
تولید کد Generate
تابع تولید کد(pkg: رشته، queries: وکتور<پرسمان>، c: فهرست جداول، err &: گزارش): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: db-sql-Methods.salam